C_函数_递归

1.定义
一个函数直接或间接地调用自己
 
2.不同函数间的相互调用
 1 #include<stdio.h>
 2 
 3 void a(void);    //函数声明
 4 void b(void);
 5 void c(void);
 6 
 7 void a(void)
 8 {
 9     printf("aaaa\n");    //②执行完这一步,然后跳转到b()函数
10     b();
11     printf("1111\n");    //⑥执行完a()剩下语句后回到main函数
12 }
13 
14 void b(void)
15 {
16     printf("bbbb\n");    //③执行完这一步跳转到c()函数
17     c();
18     printf("2222\n");    //⑤执行完b()剩下的语句后回到a()
19 }
20 
21 void c(void)
22 {
23     printf("cccc\n");    
24     printf("3333\n");    //④执行完c()后回到b()函数执行剩下语句
25 }
26 
27 int main(void)    //①程序从main函数开始
28 {
29     a();    
30 
31     return 0;
32 }

输出:​
​aaaa
bbbb
cccc
3333
2222
1111

3.递归举例

 1 #include<stdio.h>
 2 
 3 void f(int n)
 4 {
 5 
 6     if(n==1)
 7         printf("哈哈!\n");
 8     else
 9     {
10         printf("2\n");
11         f(n-1);
12     }
13 }
14 
15 int main(void)
16 {
17     f(5);
18     return 0;
19 }
20     


输出:

2
2
2
2
哈哈!



4.函数为什么能自己调用自己
A函数调用A函数和A函数调用B函数在计算机看来是没有任何区别的(详见 C_函数_笔记 函数的调用),只不过用我们日常的思维方式理解比较怪异而己。

5.递归必须满足的三个条件
①递归必须有一个明确的终止条件
②该函数所处理的数据规模必须在递减
③这个转化必须是可解的

6.递归和循环的比较
①递归
易于理解
速度慢
存储空间大
②循环
不易理解
速度快
存储空间小
例:

 1 //阶乘用循环实现
 2 
 3 #include<stdio.h>
 4 
 5 int main(void)
 6 {
 7     int n;  
 8     int i;    
 9     int sum=1;
10     scanf("%d",&n);
11 
12     for(i=1;i<=n;++i)    
13     {
14         sum=i*sum;
15     }
16 
17     printf("%d\n",sum);
18     
19     return 0;
20 }
 1 //阶乘用递归实现
 2 
 3 #include<stdio.h>
 4 
 5 int f(int n)
 6 {
 7     if(1==n)
 8         return 1;
 9     else
10         return n*f(n-1);
11 }
12 
13 int main(void)
14 {
15     int n;
16     scanf("%d",&n);
17 
18     printf("%d的阶乘是%d",n,f(n));
19 
20     return 0;
21 }

7.递归的应用
①树和森林就是以递归的方式来定义的
②数和图的很多算法就是以递归来实现的
③很多数学公式就是以递归的方式定义的(例:斐波那契序列)

8.  1+2+3+…+100用递归实现

 1 #include<stdio.h>
 2 
 3 int max(int i)
 4 {
 5     if(1==i)
 6         return 1;
 7     else
 8         return max(i-1)+i;
 9 }
10 
11 int main(void)
12 {
13     int i=100;
14 
15     printf("%d",max(i));
16 
17     return 0;
18 }

9.汉诺塔程序​

 1 #include<stdio.h>
 2 
 3 void hannuota(int n,char A,char B,char C)
 4 {
 5    /*如果n等于1
 6     直接将A上的盘子移动到C
 7     否则
 8     将A上的n-1个盘子借助C移动到B
 9     直接将A上的第n个盘子移动到C
10     将B上的n-1个盘子借助A移动到C
11     */
12 
13     if(1==n)
14         printf("将编号为%d的盘子从%c移动到%c\n",n,A,C);
15     else
16     {
17         hannuota(n-1,A,C,B);
18         printf("将编号为%d的盘子从%c移动到%c\n",n,A,C);
19         hannuota(n-1,B,A,C);
20     }
21 }
22  
23 int main(void)
24 {
25     int n;
26     char ch1='A';
27     char ch2='B';
28     char ch3='C';
29     scanf("%d",&n);
30 
31     hannuota(n,ch1,ch2,ch3);
32 
33     return 0;
34 }


猜你喜欢

转载自www.cnblogs.com/qinenxi/p/11388306.html