递归的定义:
程序调用自身的编程技巧称为递归,就是运行时调用了自己。
什么样的问题适合使用递归方式:
如果一个大问题可以拆分成几个小问题,其中有n个小问题和原来的大问题本质一样,只是难度小一些。这种问题可以考虑采用递归的方式解决。
递归函数的编码原则:
1、编写语句把问题的拆分方式描述出来。
2、在函数的开头写一个分支语句处理不可拆分的情况(这个分支必须可以让函数结束)
下面讲解几个例子了解什么是递归。
例一:古典问题——有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第三年每个月的兔子总数为多少?(提示:兔子的规律为数列1,1,2,3,5,8,13,21....)
PS:如果生的都是公兔子或者母兔子就不用算了,不知道大家有没有想过,想到过的请举手!
月份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
小兔子 | 1 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 |
大兔子 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 |
总数 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 |
通过表格分析,可以看出:
F(n) = F(n-1) + F(n-2);
#include
int fei(int num){
if(num <= 2){
return;
}
return fei(num - 1) + fei(num - 2);
}
int main(){
int num1 = 0;
printf("请输入第三年的月份:\n");
scanf("%d",&num1);
printf("第三年第%d个月生%d只兔子",num1,fei(36 + num1));
return 0;
}
例二:趣味问题——年龄。有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
#include
int age(int num){
if(num == 1){
return 10;
}
return age(num - 1) + 2;
}
int main(){
printf("第5个人的年龄是%d\n",age(5));
return 0;
}
例三:趣味问题——猴子吃桃。海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
#include
int peach(int num){
if(num == 1){
return 6;
}
return ((peach(num - 1) + 1) * 5);
}
int main(){
printf("总共有桃子数为:%d\n",peach(5));
return 0;
}