求斐波那契数列的第n个数(C语言)

        写这个是因为之前做题遇到它,我想这不是简单轻松easy吗,结果就超时了……太集中在递归上了,我们的动态规划有一点问题就解决不了,未来可寄了属于是。

那么斐波那契数列这一个大一上C语言就有的问题,还是应该用老师教的方法来写比较好,我们来回味一下经典。

#include<stdio.h>
#include<time.h>//这是待会用来展示运行时间用的
int F(int n) {//n是指要求的第n项。一般的题估计返回值不会超过int,超了就改一下
	if (n == 1 || n == 2) return 1;
	int dp0 = 1, dp1 = 1;
	for (int i = 3; i <= n; i++) {
		int temp = dp1;
		dp1 = dp0 + dp1;
		dp0 = temp;
	}
	return dp1;
}
int main() {
	int n;
	scanf("%d", &n);
	printf("%d\n", F(n));
	printf("运行时间是%.2f\n", (double)clock() / CLOCKS_PER_SEC);
	return 0;
}

运行展示图:

这里使用dp0和dp1不停迭代来实现。

但是很明显斐波那契数列是有递推公式的,而且它的形式非常想让人使用递归,那我们就来看看递归吧。

#include<stdio.h>
#include<time.h>
int F(int n) {//n是指要求的第n项。一般的题估计返回值不会超过int,超了就改一下
	if (n == 1 || n == 2) return 1;
	return F(n - 1) + F(n - 2);
}
int main() {
	int n;
	scanf("%d", &n);
	printf("%d\n", F(n));
	printf("运行时间是%.2f\n", (double)clock() / CLOCKS_PER_SEC);
	return 0;
}

展示图:

 咦,递归好像比上面一种方法快啊,别急。

 

至于为什么递归里n不取45,是因为我电脑风扇在狂转,再运行下去我怕电脑坏了。实际上如果递归方法的n真取45,是要花很长时间才能运行的。

 为什么?你递归程序写爽了,电脑可一点不爽。比如就算F(45),那么按照递归的逻辑要算F(44)和F(43)的和,但是你算F(44)的时候又算了一次F(43),也就是说递归这里有很多重复的计算,一旦数大了起来反而根本不快。

至于有没有更好的递归方法,我也不知道,如果看官你想到了,记得教教我。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值