斐波那契数列:1,1,2,3,5……第三项是前两项的和,依次类推。
题目:写一个函数,给出n,求斐波那契数列的第n项。
最普通的方法是用递归来解这个题。
long long Fibonacci(unsigned n)
{
if (n <= 0)
return 0;
if (n == 1)
return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
测试代码:
void TestFun()
{
long long ret = 0;
ret=Fibonacci(20);
printf("ret=%d\n", ret);
}
int main()
{
TestFun();
return 0;
}
很好理解 当n<=0时,返回0,当n>1时先递归求后面两项,最后递归结束的条件是n==1。
分析这个斐波那契数的递归解法。
上面是递归解法的树形图,要先求F(10)首先要求F(8),F(9)。然后分别再求F(8),F(9)。依次类推,从这个图看出来重复的节点很多。这种重复随着n的增加会急速增长。最后导致内存开销太大。大家不妨求一下第100项,感受一下到底慢到什么程度。
改良程序:
要改良这个程序也很简单,我们只要避免重复计算相同节点就行了。从前往后计算就行了。比如要算F(10),就先从F(0),F(1)开始。代码如下:
long long Fibonacci(unsigned n)
{
int result[2] = { 0, 1 };
if (n < 2)
return result[n];
long long Fibnasecond = 1;
long long Fibnafirst = 0;
long long FibN = 0;
for (unsigned i = 2; i <= n; ++i)
{
FibN = Fibnafirst + Fibnasecond;
Fibnafirst=Fibnasecond ;//把第二个给第一个数
Fibnasecond = FibN;//把第三个数给第二个
}
return FibN;
}
执行结果: