递归和非递归
文章目录
- 递归
- 非递归
前言
斐波那契数列(Fibonacci sequence)是一个非常有名的数列,由 Leonardo Fibonacci 在 13 世纪初引入,用于描述兔子繁殖的问题。该数列的定义如下:
- 第 1 项为 1;
- 第 2 项为 1;
- 从第 3 项开始,每一项都等于前两项之和。
因此,斐波那契数列的前几项分别为 1、1、2、3、5、8、13、21、34、55、89、144、233、377……
斐波那契数列具有很多特殊的性质,例如:
- 其比值趋近于黄金分割值(约为 1.618),即相邻两项的比例趋近于这个值。
- 满足很多数学和自然规律,如菜叶的排列、植物的组织形态等等。
-
使用递归的方式计算了斐波那契数列的第 n 项。但需要注意的是,当输入较大的数时(如 n >= 45),该程序的运行时间将变得非常长,因为每次递归调用都会重复计算之前已经求解过的值。
因此,为了提高该程序的效率,可以考虑使用循环来代替递归,或者使用数组来记录之前已经计算过的值,以避免重复计算。
一、递归
代码如下(示例):
int fib(int a)
{
if (a == 1 || a == 2)
return a;
else
return fib(a - 1) + fib(a - 2);
}
int main()
{
int a = 0;
scanf("%d", &a);
int ret=fib(a);
printf("%d", ret);
return 0;
}
二 非递归
//递归和非递归分别实现求第n个斐波那契数
int fib(int a)
{
int i = 0;
int f1 = 1;
int f2 = 1;
int f3 = 0;
if (a == 1 || a == 2)
return 1;
for (i = 3; i <= a; i++)
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
int main()
{
int a = 0;
scanf("%d", &a);
int ret=fib(a);
printf("%d", ret);
return 0;
}