斐波那契数列(Fibonacci sequence),又称黄金分割数列 ,因数学家莱昂纳多· 斐波那契 (Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:1、1、2、3、5、8、13、21、34……在数学上,这一数列以如下 递推 的方法定z义:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。
迭代(把大事化小)递归,简讲就是自己调用自己,自己包含自己。
迭代的:两个必要条件
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越接近这个限制条件。
定义 优点 缺点
递归 重复调用函数自身实现循环
a.用有限的循环语句实现无限集合;
b.代码易读;
c.大问题转化成小问题,减少了代码量。
a.递归不断调用函数,浪费空间
b.容易造成堆栈溢出
迭代
利用变量的原值推出新值;
函数内某段代码实现循环。
a.效率高,运行时间只随循环的增加而增加;
b.无额外开销。
a.代码难理解;
b.代码不如递归代码简洁;
c.编写复杂问题时,代码逻辑不易想出
两者关系
a.递归中一定有迭代,但是迭代中不一定有递归;大部分可以相互转换。
b.相对来说,能用迭代不用递归(因为递归不断调用函数,浪费空间,容易造成堆栈溢出)
递归与迭代:求n个斐波那契数列
1.递归方法
#include <stdio.h>
int Fib(int n)
{
if (n <= 2)
return 1;
else
return (Fib(n - 1) + Fib(n - 2));
}
//2.迭代方法
#include <stdio.h>
int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
int ret = 0;
printf("请输入一个正整数:");
scanf_s("%d", &n);
ret = Fib(n);
printf("ret=%d\n", ret);
return 0;
}