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

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

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

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

}

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

时间: 2024-10-06 14:19:00

学习了解递归和尾递归的区别的相关文章

线性递归和尾递归

线性递归,就是大家平常说的递归,线性递归函数的最后一步操作不是递归操作,将最终条件代入计算.在每次递归调用时,递归函数中的参数,局部变量等都要保存在栈中,当数据量很大的时候,会造成栈溢出. 尾递归,也就是线性迭代,尾递归函数的最后一步操作是递归,也即在进行递归之前,把全部的操作先执行完,这样的好处是,不用花费大量的栈空间来保存上次递归中的参数.局部变量等,这是因为上次递归操作结束后,已经将之前的数据计算出来,传递给当前的递归函数,这样上次递归中的局部变量和参数等就会被删除,释放空间,从而不会造成

算法学习笔记 递归之 快速幂、斐波那契矩阵加速

递归的定义 原文地址为:http://blog.csdn.net/thisinnocence 递归和迭代是编程中最为常用的基本技巧,而且递归常常比迭代更为简洁和强大.它的定义就是:直接或间接调用自身.经典问题有:幂运算.阶乘.组合数.斐波那契数列.汉诺塔等.其算法思想: 原问题可分解子问题(必要条件): 原与分解后的子问题相似(递归方程): 分解次数有限(子问题有穷): 最终问题可直接解决(递归边界): 对于递归的应用与优化,直接递归时要预估时空复杂度,以免出现用时过长或者栈溢出.优化递归就是以

递归与尾递归(C语言)

原文:递归与尾递归(C语言)[转] 作者:archimedes 出处:http://www.cnblogs.com/archimedes/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 在计算机科学领域中,递归式通过递归函数来实现的.程序调用自身的编程技巧称为递归( recursion). 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模

jQuery学习之prop和attr的区别

http://blog.sina.com.cn/s/blog_655388ed01017cnc.html .prop() 1..prop( propertyName ) 获取匹配集合中第一个元素的Property的值 2. .prop( propertyName, value ) .prop( map ) .prop( propertyName, function(index, oldPropertyValue) ) 给匹配元素集合设定一个或多个属性 .prop()和 .attr()区别 下面是

【万字总结】探讨递归与迭代的区别与联系及如何求解10000的阶层

递归和迭代 这两个概念也许很多童鞋依旧分不清楚,下面通过求解斐波那契数来看看它们俩的关系吧. 斐波那契数的定义: f0=0 f1=1 fi=fi?1+fi?2(i>1) 递归: (factorial 6) (* 6 (factorial 5)) (* 6 (* 5 (factorial 4))) (* 6 (* 5 (* 4 (factorial 3)))) (* 6 (* 5 (* 4 (* 3 (factorial 2))))) (* 6 (* 5 (* 4 (* 3 (2 (factori

递归与尾递归总结

  TAIL_RECURSIVE_QUICKSORT(A,p,r) while p<r //Partiton and sort left subarray q = PARTITION(A,p,r) TAIL_RECURSIVE_QUICKSORT(A,p,q-1) p = q+1  转自.http://www.cnblogs.com/Anker/archive/2013/03/04/2943498.html 1.递归 关于递归的概念,我们都不陌生.简单的来说递归就是一个函数直接或间接地调用自身,

黑马程序员----java基础---递归概述、递归和循环的区别

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.递归函数,通俗的说就是函数本身自己调用自己... 如:n!=n(n-1)! 你定义函数f(n)=nf(n-1) 而f(n-1)又是这个定义的函数..这就是递归 定义:程序调用自身的编程技巧称为递归( recursion). 递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小

JavaScript学习笔记 isPrototypeOf和hasOwnProperty使用区别

1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的原型链中,是则返回true,否则返回false. 格式如下: object1.isPrototypeOf(object2); object1是一个对象的实例: object2是另一个将要检查其原型链的对象. 原型链可以用来在同一个对象类型的不同实例之间共享功能. 如果 object2 的原型链中包含object1,那么 isPrototypeOf 方法返回 true. 如

递归与循环的区别

递归与循环是两种不同的解决问题的典型思路. 递归算法: 优点:代码简洁.清晰,并且容易验证正确性.(如果你真的理解了算法的话,否则你更晕) 缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响.但是,对于某些问题,如果不使用递归,那将是极端难看的代码. 循环算法: 优点:速度快,结构简单. 缺点:并不能解决所有的问题.有的问题适合使用递归而不是循环.如果使用循环并不困难的话,最好使用循环. 递归算法 和循环算法总结