题目
思路
- 学习一下思想。
- 若函数在尾位置调用自身(或是一个尾调用本身的其他函数等等),则称这种情况为尾递归。尾递归也是递归的一种特殊情形。尾递归是一种特殊的尾调用,即在尾部直接调用自身的递归函数。
-
当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。编译器可以做到这点,因为递归调用是当前活跃期内最后一条待执行的语句,于是当这个调用返回时栈帧中并没有其他事情可做,因此也就没有保存栈帧的必要了。
- 通过覆盖当前的栈帧而不是在其之上重新添加一个,这样所使用的栈空间就大大缩减了,这使得实际的运行效率会变得更高.
- 计算仅占用常量栈空间
代码
class Solution {
public int fib(int n) {
if(n==0) return 0;
else if(n==1) return 1;
return DG(0,1,n) ;
}
//a为n-2 b为n-1
public int DG(int a,int b,int n){
if(n==0) return a;
return DG(b,(a+b)%1000000007,n-1);
}
}