学习了解递归和尾递归的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习了解递归和尾递归的区别相关的知识,希望对你有一定的参考价值。

学习了递归和尾递归后,自己做了一些简单的总结,便于学习。

以典型的斐波那契数列为例,比较二者:

import java.util.Scanner;

public class testFibonacci {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(fibonacci1(n));
        System.out.println(fibonacci2(n,1,1));
        fibonacci3(n);
    }
    
    //非尾递归
    public static long fibonacci1(int n){
        if(n==1)
            return 1;
        else if(n==2)
            return 1;
        else 
            return fibonacci1(n-1)+fibonacci1(n-2);
    }
    
    //尾递归
    public static long fibonacci2(int n,int f1,int f2){
        if(n==1)
            return f1;
        else 
            return fibonacci2(n-1,f2,f1+f2);
    }
    
    //迭代法
    public static void fibonacci3(int n){
        int f1 = 1,f2 =1 ,f;
        for(int i=3;i<=n;i++){
            f = f2 ;
            f2 = f1 + f2 ;
            f1 = f ;
        }
        System.out.println(f2);
    }
    
}

递归是一种很好地的解题算法思路,但是有时候受内存的限制,导致会出现运算很慢,出现结果比较漫长,而且会产生许多的重复计算,造成浪费。相比之下,迭代对内存的要求就少的很多,因为迭代是将每一步的运算结果参与下一次运算,不会产生过多的重复计算,这样计算就非常的快,但是迭代这种思维方式比较不容易想出来,需要中间数替换。而尾递归,我觉得就是介于这二者之间的一种新的算法方式,在递归中套用迭代的思想,将每一步的结果作为参数返回,参与下次的递归运算,直到条件终止。

以上是关于学习了解递归和尾递归的区别的主要内容,如果未能解决你的问题,请参考以下文章

结合记忆和尾递归

JavaScript函数尾调用与尾递归

递归和尾递归

Python进阶 —— 尾递归

Python实现斐波那契递归和尾递归计算

Haskell中的懒惰和尾递归,为啥会崩溃?