递归之斐波那契数列



斐波那契数列

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);
}

以上就是斐波那契数列的实现及改进方法。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值