题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下:

解题思路
在学C语言的时候课本上就有斐波那契数列,实现的方法是用最直观的递归,主要代码如下:
long long Fabonacci(const int& num)
{
if (num == 1)
return 1;
if (num == 0)
return 0;
return Fabonacci(num - 1) + Fabonacci(num - 2);
}
上述解题方法存在的问题是效率太低,例如求第f(10)时,调用过程如下:
可以看到f(7)计算了3次,f(6)计算了3次,存在着大量的重复计算,所以计算效率很低。
如果在计算过程中将f(7)、f(6)等的值保存起来,在下次用到时直接使用,就可以减少很多重复计算,这就是基于动态规划的解题思想。时间复杂度为0(n)。主要实现代码如下:
long long Fibonacci(const int& n)
{
int result[2] = { 0, 1 };
if (n < 2)
return result[n];
long long preItem = 1;
long long prePreItem = 0;
long long value = 0;
for (unsigned int i = 2; i <= n; ++i)
{
value = preItem + prePreItem;
prePreItem = preItem;
preItem = value;
}
return value;
}
测试用例1
// ====================测试代码====================
void Test(int n, int expected)
{
if (Fibonacci(n) == expected)
cout << "Test for " << n << " passed." << endl;
else
cout << "Test for " << n << " failed." << endl;
}
int main(int argc, char* argv[])
{
Test(0, 0);
Test(1, 1);
Test(2, 1);
Test(3, 2);
Test(4, 3);
Test(5, 5);
Test(6, 8);
Test(7, 13);
Test(8, 21);
Test(9, 34);
Test(10, 55);
Test(40, 102334155);
system("pause");
return 0;
}