(一)题目描述
题目一:求斐波那契数列的第n项。
(二)思路分析
求解斐波那契数列有两种常用的算法:递归算法和非递归算法。
算法一:递归解法。我们以求解F(10)为例来分析递归的求解过程。想求得F(10),需要先求的F(9)和F(8)。同样,想求得F(9),需要先求得F(8)和F(7)......依次类推,直至必须先计算F(1)和F(0),然后逆推得到F(n-1)和F(n-2)的结果,从而得到F(n)要计算很多重复的值,在时间上造成了很大的浪费,算法的时间复杂度随着N的增大呈现指数增长,时间的复杂度为O(2^n),即2的n次方。
#include<iostream>
using namespace std;
class Solution {
public:
int Fibonacci(int n) {
if (n == 0)
{
return 0;
}
else if (n == 1)
{
return 1;
}
else
{
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
};
int main()
{
Solution sol;
cout<<sol.Fibonacci(10)<<endl; //55
return 0;
}
算法二:非递归解法。即反向递归的思想。从前向后计算,先根据f(0)、f(1)计算出f(2),再根据f(1)、f(2)计算出f(3)。依次类推,这样就避免了大量的重复计算,它的效率比递归算法快得多,算法的时间复杂度与n成正比,即时间复杂度O(n)。
class Solution {
public:
int Fibonacci(int n) {
if(n < 2) return n;
else
{
int fibOne = 0;
int fibTwo = 1;
int fibN = 0;
for(int i=2; i<=n; i++)
{
fibN = fibOne + fibTwo;
fibOne = fibTwo;
fibTwo = fibN;
}
return fibN;
}
}
};