递归算法
递归三要素:
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作为隐含的出口条件,大概相当于反着来递推

浙公网安备 33010602011771号