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

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

  • F_{0}=0
  • F_{1}=1
  • F_{n}=F_{​{n-1}}+F_{​{n-2}}(n≧2)

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

递归:https://blog.csdn.net/qq_40479037/article/details/87601397

 上代码:

# 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还是未脱离递归调用 

猜你喜欢

转载自blog.csdn.net/qq_40479037/article/details/87518265