LintCode(1):递归、斐波那契

来源:互联网 发布:encode url php 编辑:程序博客网 时间:2024/05/16 02:34

在了解了Java的虚拟机内存模型后,就理解了方法调用的过程。

方法调用:就是将参数、局部变量等信息压入Java方法栈中,因此,随着方法调用深度增加,方法栈也会越来越深。


一:用递归方式实现斐波那契数列,这种方式由于大量重复计算,会导致效率极低。

//递归方式实现斐波那契public int fibonacciByRecursion(int n) {if(n==1){//递归的结束条件return 0;}else if(n==2){//递归的结束条件return 1;}else if(n>2){//递归的本质就是自我调用,不断分解问题return fibonacciByRecursion(n-1)+fibonacciByRecursion(n-2);}else{//如果输入小于1的整数,则输出0return 0;}}

二:用递推实现斐波那契,效率较高。

public int fibonacciByCircle(int n){//表示第一个数和第二个数,这是初始条件int i=0,j=1,sum=0;if(n<=2){return n-1;}else{//开始循环for(int k=3;k<=n;k++){//求出这次循环的结果 sum=i+j;//为下一次循环更新数据i=j;j=sum;}return sum;}}


三:用尾递归实现斐波那契,效率接近递推,这种方式不会耗费大量栈内存,只会耗费固定内存,而且没有重复计算,本质与递推类似

//尾递归方式实现斐波那契public int fibonacciByTailRecursion(int n,int i,int j) {if(n==1){//递归的结束条件return i;}else if(n==2){//递归的结束条件return j;}else if(n>2){//每次n减1就是运算一次,然后更新i和j,这里的计算和参数共同构成迭代return fibonacciByTailRecursion(n-1,j,i+j);}else{//如果输入小于1的整数,则输出0return 0;}}

0 0