如何用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=2;第四个数为2+1=3;第五个数为3+2=5;第六个数为5+3=8…以此类推,也就是说,从第三个数开始后,当前数字值为前两个数字的和。
- 初始化生成一个数组,用来存储你将所生成的数列
- 初始化该数组的前两个数,将其赋值为1
- 根据公式 arr [ i ] = arr [ i - 1 ] + arr [ i - 2 ],利用for循环为剩下的数组元素赋值
- 输出你需要的那一位斐波那契数
具体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个斐波那契数是递归快还是非递归快_____手动_狗头  ̄▽ ̄