话不多说,上代码
#include<iostream>
using namespace std;
int Fib1(int n) //递归
{
int result;
if (1 == n || 2 == n)
{
return 1;
}
result = Fib1(n-1) + Fib1(n-2);
return result;
}
//由代码可以看出递归的办法非常简短,
//直接将斐波那契数列的递推公式带入即可实现,但与此同时这个办法也有一个缺点,
//那就是效率低下,当n较大时,计算斐波那契数需要很长时间,
//这是因为程序在每次递归调用自己时都需要算一遍n-1和n-2项,存在很多重复计算
//那怎么解决这样的问题呢,我们可以使用非递归的办法来求斐波那契数列。
int Fib2(int n) //循环
{
int result;
if (1 == n || 2 == n)
{
return 1;
}
int last2 = 1; //第i-2项
int last1 = 1; //第i-1项
for (int i = 3; i <= n; ++i) { //每次循环都要更新前一项与前两项的值
result = last1 + last2;
last2 = last1;
last1 = result;
}
return result;
}
//前一个递归之所以效率低是因为重复计算的原因,
//那如果可以避免掉这样的重复计算,
//递归方法还是可以提高效率的。
int Fib3(int n, int last2, int last1) {
if (n == 2 || n == 1) {
return last1;
}
return Fib3(n - 1, last1, last1 + last2);
}
int main()
{
int a;
cin >> a ;
int ret = Fib1(a);
int ret2 = Fib2(a);
int ret3 = Fib3(a,1,1);
cout << ret << endl;
cout << ret2 << endl;
cout << ret3 << endl;
return 0;
}