如何用C语言递归、非递归的实现斐波那契数列

如何用C语言递归、非递归的实现斐波那契数列的编写

什么是斐波那契数列????

记得高中数学课本封面上有这么一个数列:1 1 2 3 5 8 13 21 34 55 89 …
年轻的我们当时以为这只是一个简单的随机数列,从没想过这就是著名的斐波那契数列!那么,什么是斐波那契数列?这个数列是怎么来的呢?
著名的意大利数学家斐波那契曾提出过一个著名的数学问题“兔子繁殖问题”,简单来说就是一对兔子每个月能繁殖一对兔子,生下来的新兔子能在一个月后具有生殖能力,那么一年以后,我们能有多少对兔子?这就是斐波那契数列出现的原型。
具体思考如下:第一个月是1对兔子;第二个月是2对兔子,一对最初的和新生的一对兔子;第三个月是3对兔子,最初的一对兔子,和本月他们新生的一对兔子,以及刚刚具有生殖能力的那一对兔子;第四个月是5对兔子,分别是最最开始的那一对兔子,以及他们本月新生的兔子,还有第二个月生下来的那一对兔子,以及这一对兔子本月新生的一对兔子,还有最后一对,是三月份新出生,这个月刚刚具有生殖能力的那一对兔子,一共是5对兔子;就这样一直繁殖下去,5对兔子变8对,8对兔子变13对…,直到世界被兔子占领 ( ̄▽ ̄)/。按照推理,假设兔子不老不死不被人吃,那么每个月的兔子对数,就组成了我们的兔子数列,在这个数列前面加上1之后,就变成了我们最初提到的“斐波那契数列” ——1 1 2 3 5 8 13 21 34 55 89 …

那么怎么用C语言非递归的实现斐波那契数列的输出呢?

  1. 首先我们需要分析该数列的数学规律:最开始两个数为1、1,第三个数为1+1=2;第四个数为2+1=3;第五个数为3+2=5;第六个数为5+3=8…以此类推,也就是说,从第三个数开始后,当前数字值为前两个数字的和。
  2. 初始化生成一个数组,用来存储你将所生成的数列
  3. 初始化该数组的前两个数,将其赋值为1
  4. 根据公式 arr [ i ] = arr [ i - 1 ] + arr [ i - 2 ],利用for循环为剩下的数组元素赋值
  5. 输出你需要的那一位斐波那契数

具体C代码如下:

非递归代码如下

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int fib(int num) {
	int arr[100] = {0};//初始化我们的斐波那契数组,之后会按顺序存储我们的斐波那契数列
	//可根据自身需求更改当前数组的大小,比如需要第666个斐波那契数,你可以将数组大小定义为arr[1000]
	arr[0] = 1;//0号和1号按数列前两位赋值
	arr[1] = 1;
	for (int i = 2; i <= 99 ; i++) { //利用for循环生成前斐波那契数列的前100位
		arr[i] = arr[i - 1] + arr[i - 2];
	}
	return arr[num - 1];
}

int main() {
	int n=0;
	printf("您需要斐波那契数列中的哪一位?\n");
	scanf("%d",&n);
	int result=fib(n);
	printf("第%d个斐波那契数为:%d",n, result);
	return 0;
}

说了非递归的写法,那么斐波那契数列的递归写法是什么呢???

递归代码如下

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int fib(int num) {//递归
	if (num > 2) {
		return fib(num - 1) + fib(num-2);
	}
	return 1;
}
int main() {
	int n=0;
	printf("您需要斐波那契数列中的哪一位?\n");
	scanf("%d",&n);
	int result=fib(n);
	printf("第%d个斐波那契数为:%d",n, result);
	return 0;
}

递归和非递归算法的区别

  • 递归代码简单明了,但是调用成本大,耗费时间
  • 非递归代码行数较多,但运算速度更高,运行时间更短哦
  • 可以自己尝试一下求第99个斐波那契数是递归快还是非递归快_____手动_狗头  ̄▽ ̄
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值