C/C++递归与迭代|求斐波那契数

问题描述:

在使用递归方式写代码的时候会发现栈溢出和运行效率低的情况,在求斐波那契数的结果中会发现求的斐波那契数越大(例如:输入值为50)就会发现运行崩溃。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int count;//计数当x等于3时经历了几次
int fib1(int x)
{
    if (x == 3)
		count++;
    //递归计算斐波那契数
	if (x <= 2)//因为斐波那契数的前两个数都是1,所以从第三个数开始加起
		return 1;
	else
		return fib1(x - 1) + fib1(x - 2);
}

int main()
{
	int n;
	scanf("%d", &n);
	int m = fib1(n);
	printf("%d\n", m);
	printf("%d\n", count);
	return 0;
}

原因分析:

通过添加全局变量count计数时发现,x==3的时候会不断被调用,说明该递归的方法做了很多重复计算的工作,导致运行效率下降,以及栈溢出。


解决方案:

对于递归的方法会出现大量重复计算,于是使用非递归的方法来解决该问题,其中迭代法也是一种不错的解决思路。

其中的c要等于1,因为当输入的数字为1或者2时,对应的斐波那契数都是1。

之后,通过c把前两个数a,b相加得到结果,再通过a=b,b=c交换位置,满足斐波那契数等于前两数相加的需求。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//迭代函数
int fib2(int y)
{
	int a = 1;
	int b = 1;
	int c = 1;//这里c要等于1,因为当输入的数字为1或者2时,对应的斐波那契数都是1
	while (y >= 3)
	{
		c = a + b;
		a = b;
		b = c;
		y--;
	}
	return c;
}

int main()
{
	int n;
	scanf("%d", &n);
	int z = fib2(n);
	printf("%d", z);

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值