码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-03-18 13:18:49      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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);
    }
    
}

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

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

标签:

原文地址:http://www.cnblogs.com/BuleMouse/p/5291571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!