鱼C论坛

 找回密码
 立即注册
查看: 917|回复: 4

[已解决]汉诺塔整蒙了递归理不清了

[复制链接]
发表于 2021-2-3 22:33:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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;
}
最佳答案
2021-2-4 15:23:06
本帖最后由 李京 于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-4 08:47:57 | 显示全部楼层
其实递归这个东西不用着急,我刚接触汉诺塔的时候也是很懵,但是随着学习的深入你会发现很神奇的就理解了,具体怎么理解的我说不清楚,但是就是学的多了,就自然懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-4 11:33:39 | 显示全部楼层
小甲鱼的铁粉 发表于 2021-2-4 08:47
其实递归这个东西不用着急,我刚接触汉诺塔的时候也是很懵,但是随着学习的深入你会发现很神奇的就理解了, ...

好吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-4 13:56:23 | 显示全部楼层
本帖最后由 人中仙 于 2021-2-4 13:57 编辑

我也不太明白,但是我猜
它应该是利用递归函数回退时的特性生成的,递归的时候,从n层推到简单的3层汉诺塔后,回退递归函数的时侯就倒着把搬运轮子的过程打印了出来。(我语文很垃圾,请见谅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-4 15:23:06 | 显示全部楼层    本楼为最佳答案   
本帖最后由 李京 于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 18:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表