f(n) = n (n<=1 , 即n=0,1)
f(n) = f(n-1)+f(n-2) (n>1)
递归版:
int foo(int n){
if(n<=1)
return n;
return foo(n-1)+foo(n-2);
}
尾递归版:
尾递归就是函数调用出现在调用者函数的尾部, 因为是尾部, 所以根本没有必要去保存任何局部变量. 直接让被调用的函数返回时越过调用者, 返回到调用者的调用者去。尾递归就是把当前的运算结果(或路径)放在参数里传给下层函数,深层函数所面对的不是越来越简单的问题,而是越来越复杂的问题,因为参数里带有前面若干步的运算路径。
所以尾递归要改函数参数
int foo(int n,int cur,int next){
if(n==0)
return cur;
return foo(n-1,next,next+cur);
}
int main(){
foo(5,0,1);
}
这个函数啥意思呢? 其实是从0开始,当前值是cur,下一个值是next,而根据f(n) =f(n-1)+f(n-2) 下下个值是next+cur,也就是下一层的next,而下一层的cur就是上一层的next, 而n就是我要重复的层数,当层数减少到0的时候,返回。
也可以改成下面这种形式 更直观一点。
int foo(int n, int i=0, int cur=0, int next=1) {
if (i == n)
return cur;
return foo(n, i + 1, next, cur + next);
}
循环版本:
int foo(int n) {
if (n == 0 || n == 1)
return n;
int fibi; //f(n)
int fibi_1 = 1; //f(n-1)
int fibi_2 = 0; // f(n-2)
for (int i = 2; i <= n; ++i) {
fibi = fibi_1 + fibi_2;
fibi_2 = fibi_1;
fibi_1 = fibi;
}
return fibi;
}