#include<stdio.h>
void hannuota(int n,char A,char B,char C)
{
if(1==n) printf("将编号为%d的盘子从%c柱子移动到%c柱子\n",n,A,C);
else
{
hannuota(n-1,A,C,B);
printf("将编号为%d的盘子从%c柱子移动到%c柱子\n",n,A,C);
hannuota(n-1,B,A,C);
}
}
int main()
{
char ch1='A';
char ch2='B';
char ch3='C';
int n;
printf("请输入要移动盘子的个数:");
scanf("%d",&n);
hannuota(n,'A','B','C');
return 0;
}
汉诺塔自然语言:
如果是1个盘子(即最后的递归最后一步
直接将A柱子上的盘子从A移动到C
否则
先将A柱子上的n-1个盘子借助C移动到B
直接将A柱子上的盘子从A移动到C
最后将B柱子上的n-1个盘子借助A移动到C
思考:
1> 今天再次看这个代码,缓了一会有点懵(没看懂输出,原来输出也是在递归里,所以先看到的输出代码是最后输出的,即一直递归下去,最后递归到n==1的时候先输出if(1==n)的那行代码(没毛病,整个人顺畅了))
2>再次遇到递归的题目的时候,可以按照这个思路,先把自然语言写出来,再代码实现。
如果直接写代码的话,我可能会陷入递归思路的不解之中(菜勿喷),对着自然语言直接写代码,不用管里面的递归逻辑就很nice
汉诺塔是看郝斌老师学习的,上图的最后一句话!
(郝斌老师汉诺塔-> 【郝斌】-数据结构入门_哔哩哔哩_bilibili)
22年3月12日 又来 发现之前写的有问题
(已经改正确了,我之前把这里的ABC加上了' ')
递归函数里面的 形参不用加 ' '
只有main里那个需要加 ' ',只是形参和实参一样了 ,有些迷惑性。改成
也可。 这样看来被调用函数内的参数是一类,所以不用加' '了 (x,y,z就是char类型)