前言
本文根据郝斌老师的教导记录此文章
一、递归满足三个条件
1、递归必须得有一个明确的终止条件。
2、该函数所处理的数据规模必须在递减。
3、这个转化必须是可解的。
二、递归的示例
1.n的阶乘
代码如下(示例):
#include <stdio.h>
long JieCheng(long n);
int main(void) {
int i;
printf("请输入一个数:");
scanf("%d", &i);
printf("%d的阶乘是:%ld\n", i, JieCheng(i) );
return 0;
}
long JieCheng(long n) {
if(1 == n) {
return 1;
}
else {
return JieCheng(n-1) * n;
}
}
结果显示:

2.求1+2+3+…+100的和
代码如下(示例):
#include <stdio.h>
int func(int n);
int main(void) {
int n = 100;
printf("1+2+3+...+100 = %d\n", func(n));
return 0;
}
int func(int n) {
if( 1 == n ) {
return 1;
} else {
return func(n-1) + n;
}
}
结果显示:

3.汉诺塔
描述:假设有三个柱子,分别是A,B,C,然后有三个盘子都在A柱子上,现在要把A柱子的盘子移动到C柱子上。
过程图:

代码如下(示例):
/*
* 题目:汉诺塔
* 目标:有三个柱子,A B C。有n个盘子放在A柱子上,然后把A柱子的盘子转移到C柱子上
* 要求:每次只能移动一个盘子;一开始,盘子在A柱子上由大到小排序,最大的盘子放在最下面
*
*/
#include <stdio.h>
void hannuota(int n, char A, char B, char C);
int main(void) {
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
int n;
printf("请输入要移动盘子的个数:");
scanf("%d", &n);
hannuota(n, 'A', 'B', 'C');
return 0;
}
void hannuota(int n, char A, char B, char C) {
/*
* 如果是一个盘子
直接将A柱子上的盘子从A移到C
否则
先将A柱子上的n-1个盘子借助C移到B
直接将A柱子上的盘子从A移到C
最后将B柱子上的n-1个盘子借助A移到C
*/
if(1 == n) {
printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n", n, A, C);
} else {
hannuota(n-1, A, C, B); //现在有n个盘子在A,将n-1个盘子借助C移动B
printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n", n, A, C); //直接将A柱子上的盘子从A移到C
hannuota(n-1, B, A, C); //现在有n-1个盘子在B,将n-1个盘子借助A移动到C
}
}
结果显示:

本文介绍了递归的基本概念和三个经典示例:计算阶乘、求等差数列和及解决汉诺塔问题。通过C语言代码展示了递归在解决这些问题时的应用,强调了递归的终止条件、数据规模递减和可解性三大要素。
2130

被折叠的 条评论
为什么被折叠?



