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 }