汉诺塔整蒙了递归理不清了
#include<stdio.h>void hanoi(int n,char x,char y,char z);
void hanoi(int n,char x,char y,char z)
{
if(n==1)
{
printf("%c-->%c\n",x,z);
}
else
{
hanoi(n-1,x,z,y);
printf("%c-->%c\n",x,z);
hanoi(n-1,y,x,z);
}
}
int main(void)
{
int n;
printf("请输入汉诺塔的层数:");
scanf("%d",&n);
hanoi(n,'X','Y','Z');
return 0;
}{:10_266:} 其实递归这个东西不用着急,我刚接触汉诺塔的时候也是很懵,但是随着学习的深入你会发现很神奇的就理解了,具体怎么理解的我说不清楚,但是就是学的多了,就自然懂了 小甲鱼的铁粉 发表于 2021-2-4 08:47
其实递归这个东西不用着急,我刚接触汉诺塔的时候也是很懵,但是随着学习的深入你会发现很神奇的就理解了, ...
好吧{:10_266:} 本帖最后由 人中仙 于 2021-2-4 13:57 编辑
我也不太明白,但是我猜
它应该是利用递归函数回退时的特性生成的,递归的时候,从n层推到简单的3层汉诺塔后,回退递归函数的时侯就倒着把搬运轮子的过程打印了出来。(我语文很垃圾,请见谅{:10_266:} 本帖最后由 李京 于 2021-2-4 15:26 编辑
这些注释,再加上汉诺塔那一课的知识点备忘,说不定可以看懂
#include<stdio.h>
void hanoi(int n,char x,char y,char z);
void hanoi(int n,char x,char y,char z)//n 是层数x 最开始所有盘所在的柱子(起始位置)y借助的柱子z 要移动到的柱子(目标)
{
if(n==1)//判断是不是只有一层,(递归出口)
{
printf("%c-->%c\n",x,z);//就直接把第一个给移动到目标的柱子去
}
else//就要把最底层的盘移动到目标柱子去
{
hanoi(n-1,x,z,y);//就要把n-1层从x 借助 z移动到 y
printf("%c-->%c\n",x,z);//把最底层的盘移动到目标柱子去(这里的时候除了最底层的盘,其他的已经到了y上了)
hanoi(n-1,y,x,z);//就要把n-1层的从y借助x 移动到 z 为什么是从y因为你把盘移动到了 y 上
}
}
int main(void)
{
int n;
printf("请输入汉诺塔的层数:");
scanf("%d",&n);
hanoi(n,'X','Y','Z');
return 0;
}
你还可以看一看这个up主讲的递归思路很清晰,不过有局限,https://www.bilibili.com/video/BV1Nx411D712
页:
[1]