递归:顾名思义就是找规律,正式的定义是在调用一个函数的过程中又出现直接或间接地调用该函数自己本身,称为函数的递归调用。这里基本都是函数调用函数,主要是找其中的规律。
例如:有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁。问第4个学生岁数,他说比第3个学生大2岁。问第3个学生岁数,他说比第2个学生大2岁,问第2个学生岁数,他说比第1个学生大2岁,最后问第一个学生,他说是10岁,请问第5个学生多大?
解析:从这个题中我们知道的是第1个学生的年龄,她是10岁,从题中,我们还可以看出,第2个学生比第一个学生大2岁,第3个学生比第2个学生大2岁,以此类推,第5个学生比第4个学生大2岁,如果从数学的角度,这个题很好算,第5个学生年龄为10+2+2+2+2=18岁,那么我们如何转换成代码呢?这里就要用递归的思想了
因此就可以用程序:
#include<stdio.h>
int Age1(int n)
{
int a = 10;
for(int i=1; i<n; i++)//用循环,通用
{
a += 2;
}
return a;
}
//Age(n):第n个学生的年龄
//Age(n-1):第n-1个学生的年龄
//Age(1):第1个学生的年龄
int Age(int n)
{
int b;
if(n == 1)
{
b = 10;
}
else
{
b = Age(n-1)+2;
}
return b;
}
int main()
{
for (int i = 1; i <= 5; i++)//打印每一人的年龄
{
printf("%d ", Age(i));//Age1(i)
}
printf("\n");
}
运行结果:
那么会有人这个程序很简单,不知道如何触发条件,让我们一起看下面的这个过程
做几道练习题吧!!!
1. 猴子吃桃问题(后一天比前一天吃一半再多吃一个),求第一天总共摘了多少个桃子。思想就是:从第10天剩一个桃子,我们逆着往第一天去推,这就是递归的思想
解析:猴子吃桃也就是,第1天吃了总的一半加1个,第2天吃了剩下的一半加1个,以此类推,在第10天时剩了1个。那我们编写这个程序之前,先找一下他们之间的规律吧,逆着来推,也就是,第9天的桃子是第10天桃子加1再2倍个,第8天的桃子是第9天桃子加1再2倍个,……,第2天的桃子是第3天桃子加1再2倍个,第1天的桃子是第2天桃子加1再2倍个,与上面年龄问题相同,就是函数调用函数,直到触发 if 条件,题也就解出来了。
2. 求n的阶乘,这里n=5,并且输出0~5的阶乘
解析:其实这几个题的思想是一样的,但是在这块要注意如果输入数字为0怎么办?因此,在 if 中就要先将这个条件加着,0!=1。
3. 求1+2+……+n,这里n=10,用递归的方法,不用for循环
注意:n=0
4. 斐波那切数列,不建议用递归,当n为40时,运算速度变慢,不如for循环,这个可以自己测试下。
//Fac(n):求n!== (n-1)!*n
//Fac(n-1):求(n-1)!
//Fac(1):1
//Fac(0):1
学完递归,其实递归的思想很简单,编写也很简单,就是找出其中的规律。但是我们从斐波那切数列的程序可以得出,递归可以用,但是在运算时间和复杂度上,递归还是比较浪费时间的,因为计算机内部要自己进行推等一系列操作,反而for循环比较好用,也不会浪费空间,因此,在以后的编写中还是推荐运用for循环,既简单又方便。