胖胖的小阿涵 发表于 2021-2-3 22:33:45

汉诺塔整蒙了递归理不清了

#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:57

其实递归这个东西不用着急,我刚接触汉诺塔的时候也是很懵,但是随着学习的深入你会发现很神奇的就理解了,具体怎么理解的我说不清楚,但是就是学的多了,就自然懂了

胖胖的小阿涵 发表于 2021-2-4 11:33:39

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

好吧{:10_266:}

人中仙 发表于 2021-2-4 13:56:23

本帖最后由 人中仙 于 2021-2-4 13:57 编辑

我也不太明白,但是我猜
它应该是利用递归函数回退时的特性生成的,递归的时候,从n层推到简单的3层汉诺塔后,回退递归函数的时侯就倒着把搬运轮子的过程打印了出来。(我语文很垃圾,请见谅{:10_266:}

李京 发表于 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
页: [1]
查看完整版本: 汉诺塔整蒙了递归理不清了