八戒253 发表于 2021-3-17 10:39:45

递归运行顺序问题

/*汉诺塔*/
#include <stdio.h>
void HAOyi(int n,char x,char y,char z)//语句5
{
    if(n==1)//语句1
    {
      printf("\t%c-->%c\n",x,z);
    }
    else
    {
      HAOyi(n-1,x,z,y);//语句2
      printf("\t%c-->%c\n",x,z);//语句3
      HAOyi(n-1,y,x,z);//语句4
    }
}
int main(void)
{
    HAOyi(3,'X','Y','Z');
    return 0;
}不知道递归的运行顺序,能否用例如(语句:2-->3-->4-->5……)的形式来讲解一下

呆鸭 发表于 2021-3-17 10:39:46

请参考

atai0622 发表于 2021-3-17 14:15:54

大致画了一下,按顺序写了,不画箭头了:1,2,1,2,1,3,4,1,4,3,4,1,2,1,3,4,1,4,4
不知道对不对

atai0622 发表于 2021-3-17 18:46:07

简单做了个图示,可能更好理解

八戒253 发表于 2021-3-17 19:22:33

atai0622 发表于 2021-3-17 18:46
简单做了个图示,可能更好理解

~~~~~~~~~~~~~~~~~~~费心了~~~~~~~~~~~~~~~~~~~
{:10_256:}{:10_256:}

八戒253 发表于 2021-3-17 19:35:56

atai0622 发表于 2021-3-17 18:46
简单做了个图示,可能更好理解

感觉是先把

八戒253 发表于 2021-3-17 19:37:43

八戒253 发表于 2021-3-17 19:35
感觉是先把

HAOyi(n-1,x,z,y);
printf();[/code

这个执行完之后再执行下面的这个HAOyi(n-1,y,z,x);

atai0622 发表于 2021-3-17 22:08:53

八戒253 发表于 2021-3-17 19:37
HAOyi(n-1,x,z,y);
printf();[/code



对啊,应该是,我画的不是么……

学抓蟒蛇 发表于 2021-3-18 09:53:03

{:10_272:}

八戒253 发表于 2021-3-18 14:24:45

atai0622 发表于 2021-3-17 22:08
对啊,应该是,我画的不是么……

加个好友呗,亲爱的鱼油!一起学习,一起进步!

atai0622 发表于 2021-3-18 17:09:54

加过了,我也是新手,大家多交流,共同进步哈

一直迷失的海豚 发表于 2021-3-24 22:30:31

这个递归的运行顺序大致是:输入的数据不是3嘛,就说明汉洛塔有三层。主函数主要就是定义三座不同的岛屿。而在自定义函数中,就是由输入塔的层数来判断其要进行的步骤。当只有一层时,直接把x岛上的塔移到z岛就ok了,一旦其层数大于1,就要借助辅助塔来完成这个过程,这是为了满足塔要从下至上是一个由达到小的顺序。输入的·数据不是三嘛,那就是有三层塔,首先我们移动最上面的那一个塔,把它从x移动到y,这是为了给比它大的塔层让出位置,然后再把x上剩下的最上面那一个移动到z,然后我们需要的是把最大的那个塔放在z的最下面,但是现在z塔已经有了一个塔,所以我们要让z塔空出来,而y上面的那个就可以移动到x上,刚好满足题目要求,那么我们的y就空出来了,可以把在z上面的塔移动到y上面,再就可把x最上面的那个塔移动到y上,满足题目要求,最后就可以把x上面不最大的那个塔移动到z上,把y上面的小塔移动到x上,把y下面的塔移动到z上,最后一步,就是把x上的塔移动到z上面,ok,完工。我觉得在这个代码里面最核心的就是这几句,再就是一个递归循环。
HAOyi(n-1,x,z,y);//语句2---把x上的塔借助z移动到y上

12.      printf("\t%c-->%c\n",x,z);//语句3---输出要执行的步骤:有了上一步的铺垫,就可以把x上面最大的那一个直接移动到z了

13.      HAOyi(n-1,y,x,z);//语句4---把y上的塔借助x移动到z。

八戒253 发表于 2021-3-26 17:15:49

一直迷失的海豚 发表于 2021-3-24 22:30
这个递归的运行顺序大致是:输入的数据不是3嘛,就说明汉洛塔有三层。主函数主要就是定义三座不同的岛屿。 ...

谢谢啦!
页: [1]
查看完整版本: 递归运行顺序问题