斐波那契数列
f(n) = 1 1 2 3 5 8 13 21 34 55 89 144 233 377 ...
特点:第n项的值等于第n-1和第n-2项值的和
问题描述:求斐波那契数列的第n项
实现:
1循环
int fac(int n)
{
if (n<=0)
return 0;
int a = 1;
int b = 1;
int value = 0;
for (int i=3;i<=n;++i)
{
value = a+b;
a=b;
b=value;
}
return value;
}
void main()
{
int value=fac(12);
cout<<value<<endl;
}
2递归实现
递归:把一个规模很大的问题分解成小规模的相同问题,从而求得大规模问题的结果
int num = 0;//标识递归的次数
int fun(int n)
{
num++;
if (n<=0)
return 0;
if (n<3)
return 1;
else
return fun(n-2)+fun(n-1);
}
void main()
{
int n = 10;
int value = fun(n);
cout<<value<<endl;
cout<<num<<endl;
}
解析:要计算第n项,先要计算第n-1项和第n-2项,仍然调用函数fac来进行,n减少到1,2时返回值,然后依次向前返回,从而计算出第n项的值。n<3为递归结束条件
现在有一个问题:
中间会计算很多重复值,使递归次数成倍增长,还可能造成栈溢出
所以,消除重复值的计算方法
int num = 0;
static int temp = 1;
int fun(int n)
{
num++;
int result = 0;
int add = 0;
if (n<=0)
return 0;
if (n<3)
return 1;
else
result = fun(n-1);
add = temp+result;
temp = result;
return add;
}
利用一个静态变量记录递归时记录的函数值
另一种改进方法:模仿循环方法,用递归实现
int num = 0;
int fac(int n,int a,int b)
{
++num;
if (n<3)
return a;
else
return fac(n-1,a+b,a);
}
int fun(int n)
{
int a = 1;
int b = 1;
if (n<1)
return 0;
return fac(n,a,b);
}
以上就是斐波那契数列的实现及改进方法。