C语言 - 函数:递归函数

■ 递归

递归概念:就是在运行的过程中自己调用自己。每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出

构成递归需具备的条件

1. 子问题须与原始问题为同样的事,且更为简单

2. 不能无限制地调用本身,必须有个出口

递归原理:先看代码

 1 #include <stdio.h>
 2 
 3 int print_i(int i) {
 4     
 5     // 递归终止条件:当 i <= 0 时,不再进入 if 块,直接返回
 6     if (i > 0) {
 7         
 8         // 【先序操作】在递归调用之前执行
 9         // 特点:随着递归深入,i 的值依次减小,所以是正序打印 (5, 4, 3, 2, 1)
10         printf("i = %d \n", i);  
11         
12         // 【递归调用】进入下一层递归,参数为 i-1
13         // 程序会在这里暂停当前层的后续代码,直到深层递归全部结束并返回
14         print_i(i - 1); 
15         
16         // 【后序操作】在递归调用返回之后执行
17         // 特点:只有当深层递归完全结束后,才会执行这一行。
18         // 执行顺序是从最深层(i=1)开始,层层向外回溯,所以是逆序打印 (1, 2, 3, 4, 5)
19         printf("i == %d \n", i); 
20     }
21 
22     // 返回当前层的 i 值
23     return i;
24 }
25 
26 int main(int argc, const char * argv[]) {
27     
28     int a = 5;
29     
30     // 调用递归函数并打印其返回值
31     // 注意:print_i 函数最终返回的是最初传入的 a 的值(即 5)
32     printf("函数返回值:%d\n", print_i(a));
33     
34     return 0;
35 }

日志信息

代码示例:递归函数

1. 有一 4 个学生,已知最小年龄是 10 岁,后面学生的年龄依次比前面的大 2 岁,求最大年龄

1 int ageStudent(int n){
2     
3     if (n == 1) {
4         return 10;// 第一个人年龄是 10 岁
5     }else{
6         return ageStudent(n-1)+2;// 前一个人总是比后一个人大 2 岁
7     }
8 }
1 int main(int argc, const char * argv[]) {
2     
3     int num = 4;
4     printf("第 %d 个学生的年龄是 %d\n",num,ageStudent(num)); // 16 岁
5     return 0;
6 }

递归流程

2. 计算 1-10 的和 

 1 #include <stdio.h>
 2 
 3 int sumNumber(int x){
 4 
 5     if (x > 1) {
 6         
 7        printf("%d、 ",x);
 8        return x+sumNumber(x-1);
 9     }
10     printf("---%d\n",x);
11     return 1;
12 }
13 
14 int main(int argc, const char * argv[]) {
15 
16     printf("\n结果是%d\n",sumNumber(10));
17     return 0;
18 }

日志信息

3. 计算 n - m 的和

 1 // @n 首
 2 // @m 尾
 3 int sumNumer(int n,int m){
 4     
 5     if (n < m) {
 6         
 7         return sumNumer(n +1,m)+n;
 8     }else{
 9         
10         return m;
11     }
12     
13 }

4. 计算字符串长度

 1 int lenghtOfString(char array[],int count){
 2     
 3     if (array[count]) {
 4         
 5         return lenghtOfString(array, count+1);
 6     }
 7     
 8     return count;
 9 }
10 
11 int main(int argc, const char * argv[]) {
12     
13     printf("%d\n",lenghtOfString("hello", 0)); // 输出 5
14 
15     return 0;
16 }

 

posted on 2017-08-02 14:57  低头捡石頭  阅读(34)  评论(0)    收藏  举报

导航