斐波拉切数列的定义及优化

数学上,费波那契数列是以递归的方法来定义:

  • (n≧2)

递归算法的原理与局限性: 

递归:算法——递归_共性函数_AmosTian的博客-CSDN博客

 上代码:

# include<iostream>
# include<algorithm>
const int MAX_N = 10000;

using namespace std;

//斐波拉切数列定义
unsigned long long fib0(int n){
	//时间复杂度来源于要重复计算 
	if(n <= 1)
		return n;
	return fib0(n-1)+fib0(n-2);
} 

//记忆搜索 
unsigned long long memo[MAX_N+1]; 
int fib1(int n){//最多算到46,实质上还是指数阶
	
	if(n <= 1)	return n;//前两项
	//此时有未计算和已经计算好存储到数组中的两种情况
	//因为等于0的情况在斐波拉切数列中只有第一项 
	if(memo[n] != 0) return memo[n]; 
	return memo[n] = fib1(n-1)+fib1(n-2);
}

//指数阶化函数阶 
long long fib2(int n){
	if(n <= 1)
		return 1;
	long long first = 0,second = 1,third = 0;
	for(int i = 2;i <= n;++i)
	{
		third = first + second;
		first = second;
		second = third;
	 } 
	 return third;
}

int main()
{
	int n;
	cin >> n;
	cout << "fib1:" << fib1(n) << endl;
	cout << "fib2:" << fib2(n) << endl;
	cout << "fib0:";
	cout << fib0(n) << endl;
	
 return 0;
}

运行一下就会发现fib0的时间远比前两种长

相比fib1函数,它的冗余时间来源于重复计算

而对于fib2函数,它的时间浪费在算法本身

如果fib1fib2做个比较,就会发现fib2性能更为优秀,因为fib1还是未脱离递归调用 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AmosTian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值