斐波那契数列

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值