斐波那契数列:
经典数学问题之一;斐波那契数列,又称黄金分割数列,指的是这样一个数列:
1、1、2、3、5、8、13、21、……
想必看到这个数列大家很容易的就推算出来后面好几项的值,那么到底有什么规律,简单说,就是前两项的和是第三项的值,也许你会想到的是迭代,也学你想到的是递归。
简单分析一下递归:
int fibon(int n)
{
n1 ++;
if(n <= 2)//递归出口
{
return 1;
}
return fibon(n-1) + fibon(n-2);
}
这就是简单的递归,咋先分析一下,若此时你给的n为5,直接到了递归这块,那么画个图分析一下,普通的递归:
怎样优化,很简单那么你如果吧已经算过的值,保存起来下次直接用的话,会不会就递归次数明显减少了。好了下面就有两个代码,一个是非优化,一个是优化的。
#include<stdio.h>
int n1 = 0;//记录普通的递归次数
int n2 = 0;//优化的递归次数
//普通递归函数
int fibon(int n)
{
n1 ++;
if(n <= 2)//递归出口
{
return 1;
}
return fibon(n-1) + fibon(n-2);
}
//优化后的递归函数
int fibonac(int a,int b,int n)
{
n2 ++;
if(n > 2)
{
return fibonac(a+b,a,n-1);
}
return a;
}
int main()
{
int n = 10;//第几个斐波那契数列
int a = 1; //斐波那契数列的第一项
int b = 1;//第二项
int i = fibon(n);//普通的递归
int j = fibonac(a,b,n);//优化后的递归
printf("第n个fibon数是--%d\n",i);
printf("次数--%d\n",n1);
printf("第n个fibon数是--%d\n",j);
printf("次数--%d\n",n2);
return 0;
}
ok!
看看结果不难发现优化的好处了吧!