递归---> 斐波那切数列
在讲解递归之前,我们先来解决下著名的“兔子数列”(刚好是本博主的属相,偷着乐~,蛤蛤~v~)也即“斐波那切数列”。
如果我们设F表示兔子有几对,用n表示第几个月,那么第n个月的兔子数F(n)的数学表达式为:
Method 1: 很容易想到用数组解决
#include<stdio.h>
#define N 100 //根据具体要求设置值
int main(){
int i,num;int a[N];
printf("请输入你要打印的斐波那切数列个数:\n");
scanf("%d",&num);
a[0]=0;a[1]=1;
for(i=2;i<num;i++){
a[i]=a[i-1]+a[i-2];
}
for(i=0;i<num;i++){
printf("--->%d ",a[i]);
}
return 0;
}
Method 2: 根据刚刚的数学表达式,我们用递归来解决
#include<stdio.h>
int S(int n){
if(n==1){
return 1;//第一天兔子数是1;
}
if(n==2){
return 1;//第er天兔子数也是1;
}
else{
return S(n-1)+S(n-2);//从第三天开始就有此规律
}
}
int main(){
int num;
printf("请输入你要打印的斐波那切数列个数:\n");
scanf("%d",&num);
if(num<1){
printf("0\n");
return -1;
}
S(num);
printf("~~~~~%d",S(num));
return 0;
}
有关递归:
● 对比了两种实现斐波那契的代码,迭代(Method 1)和递归(Method 2)
区别 : 迭代使用的是循环结构, 递归使用的是选择结构。
● 优点:使用递归能使程序的结构更清晰、更简洁、 更容易让人理解,从而减少读懂代码的时间。
● 缺点;大量的递归调用会建立函数的副本,会消耗大量的时间和内存,而迭代则不需要此种付出
● 定义 : 递归函数分为调用和回退阶段,递归的回退顺序是它调用顺序的逆序。
● 在高级语言中,函数调用自己和调用其他函数并没有本质的不同。我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。
● 注意:写递归程序最怕的就是陷入永不结束的无穷递归中。切记,每个递归定义必须至少有一个条件, 当满足这个条件时递归不再进行,即函数不再调用自身而是返回,也叫递归的出口。 以上我们的F(n)函数结束条件是 : i< 2。
递归的思想在数据结构预算法中很重要,请大家细细品味。
-
正经致谢:(差点忘了给小可爱们致谢,罪过罪过~)