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 }