目录
前言:
斐波那契数:
斐波那契数亦称之为斐波那契数列、又称黄金分割数列、费波那西数列、费波拿契数、费氏数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*)。简单来说就是第一、二位之后的每个数都是它前边两个数的和。
一.非递归
1.算法思路
建立Fib(n)函数求n的斐波那契数。因为前两位为1,而一二位数后的每个数都等于它前面两位数的和,所以我们只需要判断n是否为前两位,若为前两位则令其等于1;否则则令其等于前面两位之和。为了节省空间,我们只需要3个变量来分别存放第一位的值、第二位的值以及它们的和,后面再分别将第二位的值赋给第一位,将和赋给第二位,再求和算出新的第三位即可求出第n个斐波那契数。
2.具体代码
#include<stdio.h>
int Fib(int n) {
if (n == 0 || n == 1) {
return 1;
}
else {
int n1 = 1, n2 = 1;
int sum = 0;
for (int i = 3; i <= n; i++) {
sum = n1 + n2;
n1 = n2;
n2 = sum;
}
return sum;
}
}
int main() {
printf("请输入一个整数n:");
int n = 0;
scanf("%d", &n);
printf("第n个斐波那契数是:%d\n", Fib(n));
return 0;
}
3.运行结果
二.递归
1.算法思路
建立Fib(n)函数求n的斐波那契数。判断n是否为前两位,如果是则返回1;如果不是则调用Fib()函数本身对它的前两个数进行相加求和。
2.具体代码
#include<stdio.h>
int fib(int n)
{
if (n <= 2)
{
return 1;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = fib(n);
printf("第n个斐波那契数为%d", ret);
return 0;
}
3.运行结果
三.总结
递归的方法代码虽然少,但每次都会重复调用fib(n-1),这种方法会占用较大空间,花费较多时间。相比之下,非递归的方法只使用三个变量,占用空间较小,花费的时间也会非常少。