# include <stdio.h>
/*
递归:
条件:
1. 有正确(明确)的终止条件
2. 该函数处理的数据规模必须递减
3. 这个转化必须是可解的
特点:
易于理解
速度慢
存储空间大
1.汉诺塔(3个柱子,A, B, C,所有的盘子在A上,将A上的所有的盘子借助B 移动到C 上)
伪代码:
如果是一个盘子
直接将A柱子上的盘子从A 移动到 C
否则
先将 A 上的n-1 个盘子借助 C 移动到 B 上
将 A 上的盘子从 A 移动到 C
最后将 B上的n-1 个盘子借助 A 移动到 C上
*/
//汉诺塔 (3个柱子,A, B, C,所有的盘子在A上,将A上的所有的盘子借助B 移动到C 上)
/*伪代码:
如果是一个盘子
直接将A柱子上的盘子从A 移动到 C
否则
先将 A 上的n-1 个盘子借助 C 移动到 B 上
将 A 上的盘子从 A 移动到 C
最后将 B上的n-1 个盘子借助 A 移动到 C上*/
void hannuota(int n ,char c1, char c2, char c3) { //3个柱子,A(c1), B(c2), C(c3),所有的盘子在A上,将A上的所有的盘子借助B 移动到C 上
//第一个参数代表需要移动的盘子的总个数,第二个参数代表原始盘子位置,第三个参数代表辅助位置,
//第四个参数代表目标位置
if(n ==1 ) { //情况1
printf("将编号为%d的盘子,从%c 移动到 % c\n",n, c1, c3);
}else { //情况2
hannuota(n - 1 ,c1, c3, c2); // 先将 A 上的n-1 个盘子借助 C 移动到 B 上
printf("将编号为%d的盘子,从%c 移动到 % c\n",n, c1, c3); //将 A 上的盘子从 A 移动到 C
hannuota(n - 1 ,c2, c1, c3); //最后将 B上的n-1 个盘子借助 A 移动到 C上
}
}
int main(void) {
printf("\n汉诺塔:\n");
hannuota(5 ,'A', 'B', 'C');
return 0;
}
结果: