递归算法


递归三要素:

1.函数功能

2.递归出口

3.等价条件


例1.有5个人围坐在一起,问第5个人多大年纪,他说比第4个人大2岁;问第4个人,他说比第3个人大2岁;问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁。,
请利用递归法编程计算并输出第5个人的年龄。 请按如下函数原型,用递归函数编写程序。 // 函数功能:用递归算法计算第n个人的年龄 unsigned int ComputeAge(unsigned int n); **输出格式要求:"The 5th person's age is %d\n"
 1 #include <stdio.h>
 2 #include <math.h>
 3 unsigned int ComputeAge(unsigned int n);    //函数功能
 4 int main(){
 5     unsigned int n = 5;
 6     int ans = (int)ComputeAge(n);
 7     printf("The 5th person's age is %d\n", ans);
 8     return 0;
 9 } 
10 unsigned int ComputeAge(unsigned int n){
11     if ( n == 1)    return 10;         //递归出口
12 return ComputeAge(n - 1) + 2;          //等价关系
13 }

  1.确定函数功能,用于计算第n个人的年龄,第n个人的年龄与第n-1个人的年龄相关,所以可以用递归

  2.寻找递归出口,题目只有第一个人的年龄,也就是ComputeAge(1)= 10,作为递归结束条件

  3.构造等价关系,找ComputeAge(1)和ComputeAge(n-1)的关系

  4.根据等价关系中n和n-1的关系检查递归出口会不会出错,题目含义中n>0,n=2时n-1=1有定义,n=1时函数返回10,不会出现n=0的情况

 

例2:用递归方法编程计算Fibonacci数列的前N项。其中fib(0)=0,fib(1)=1,fib(n)=fib(n-1)+fib(n-2)。
**输入格式要求:"%d" 提示信息:"Input n:"
**输出格式要求:"Fib(%d)=%d\n"
程序运行示例如下:
Input n:10
Fib(1)=1
Fib(2)=1
Fib(3)=2
Fib(4)=3
Fib(5)=5
Fib(6)=8
Fib(7)=13
Fib(8)=21
Fib(9)=34
Fib(10)=55
 1 #include <stdio.h>
 2 int Fib(int x);
 3 int main(){
 4     int n;
 5     printf("Input n:");
 6     scanf("%d", &n);
 7     for (int i = 1; i <= n; i++){
 8         printf("Fib(%d)=%d\n", i, Fib(i));
 9     }
10     return 0;
11 } 
12 int Fib(int x){
13     if (x <= 1)    return x;
14     return Fib(x - 1) + Fib(x - 2);
15 }

 

 例3:猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上再想吃时,见只剩一个桃子。求第一天共摘了多少桃子。

**输出格式要求:"桃子总数=%d\n"
程序运行示例如下:
桃子总数=xxxx
1 #include <stdio.h>
2 int Function(int n){
3     if(n == 1) return 1;
4     return (Function(n - 1) + 1) * 2;
5     }
6 int main(){
7     printf("桃子总数=%d\n", Function(10));
8     return 0;
9 }

这个题用for循环递推比较直观,从第十天peach=1往前推,n-1天的桃子数=(第n天桃子数+1) * 2, 循环n - 1次
用递归的思想是从第n天开始,往下找到出口条件,n=1时桃子数只有1作为隐含的出口条件,大概相当于反着来递推

告别递归算法,谈谈我的一些经验-帅地玩编程 (iamshuaidi.com)

递归算法 - 知乎 (zhihu.com)

posted @ 2021-09-12 10:41  杯椎鱼龙  阅读(337)  评论(0)    收藏  举报