为了账号安全,请及时绑定邮箱和手机立即绑定

对于标准答案的递归很多人都看不懂,其实就是一个深度优先的遍历。我写了段伪代码,将递归步骤还原并注释了一下,供大家参考,希望大家有所收获。

#if条件不成立的省略

# { 看做递归开始

# } 看做递归结束

move(4, a, b, c):{  #实际数值(4, A, B, C)

    move(3, a, c, b):{            #c,b调换,实际数值(3, A, C, B), 将这四个值带入move(3, a, b, c)递归1

        move(2, a, c, b):{        #c,b调换,实际数值(2, A, B, C), 将这四个值带入move(2, a, b, c)递归2

            move(1, a, c, b):{    #c,b调换,实际数值(1, A, C, B), 将这四个值带入move(1, a, b, c)递归3

                if n == 1:        #此时n==1,if条件成立

                print(a, '-->',c) #这是第一次打印A-->B

            }                     #最近的一次递归3完成,回到递归2,实际数值(2, A, B, C)

            print(a, '-->', c)    #这是第二次打印A-->C

            move(1, b, a, c):{    #a,b调换,实际数值(1, B, A, C), 将这四个值带入move(1, a, b, c)递归4

                if n == 1:

                print(a, '-->', c)#这是第三次打印B-->C        

            }                     #最近的一次递归4完成,回到递归2,实际数值(2, A, B, C)

        }                         #最近的一次递归2完成,回到递归1,实际数值(3, A, C, B)            

        print(a, '-->', c)        #这是第四次打印A-->B

        move(2, b, a, c):{        #a,b调换, 实际数值(2, C, A, B), 将这四个值带入move(2, a, b, c)递归5

            move(1, a, c, b):{    #c,b调换, 实际数值(1, C, B, A), 将这四个值带入move(1, a, b, c)递归6

                if n == 1:

                print(a, '-->', c)#这是第五次打印C-->A

            }                     #最近的一次递归6完成,回到递归5,实际数值(2, C, A, B)

            print(a, '-->', c)    #这是第六次打印C-->B

            move(1, b, a, c):{    #a,b调换, 实际数值(1, A, C, B), 将这四个值带入move(1, a, b, c)递归7

                if n == 1:

                print(a, '-->', c)#这是第七次打印A-->B

            }                     #最近的一次递归7完成,回到递归5,实际数值(2, C, A, B)

        }                         #最近的一次递归5完成,回到递归1,实际数值(3, A, C, B)

    }                             #最近的一次递归1完成,原参数中的move(n - 1, a, c, b)递归全部完成,实际数值(4, A, B, C)

    print(a, '-->', c)  #这是第八次打印A-->C,下面跟上面同样的方式去理解,就不写了,太累了。

    move(3, b, a, c):{

        move(2, a, c, b):{

            move(1, a, c, b):{

                if n == 1:

                print(a, '-->', c)   #这是第九次打印

            }

            print(a, '-->', c)#这是第10次打印

            move(1, b, a, c):{

                if n == 1:

                print(a, '-->', c)#这是第11次打印

            }

        }

        print(a, '-->', c)   #这是第12次打印

        move(2, b, a, c):{

            move(1, a, c, b):{

                if n == 1:

                print(a, '-->', c)   #这是第13次打印

            }

            print(a, '-->', c)#这是第14次打印

            move(1, b, a, c):{

                if n == 1:

                print(a, '-->', c)#这是第15次打印

            }

        }    

    }

}


正在回答

4 回答

非常感谢,终于慢慢的理解了

0 回复 有任何疑惑可以回复我~

换位置是因为每次递归都要重新执行算法

0 回复 有任何疑惑可以回复我~
#1

qq_必然_1

这是对c,b所代表的值如何进行替换的解释,c,b的位置替换的原因是在搬动盘子的过程中,先将盘子从a搬到c,还有从b搬到c
2019-01-20 回复 有任何疑惑可以回复我~

为什么要换位置呢?请问换位置的逻辑在哪里?

0 回复 有任何疑惑可以回复我~

补充说明一下,move(n a, b, c)里的参数变动,其实是实际参数的(4, A, B, C)的位置变动。move(n-1, a, c, b)就是讲实际参数的4减了1,B与C的位置换了,变成(3,A, C,B )。move(n-1, a, c, b)是一次性的。等下次开始算的时候就又成move(n a, b, c)。举个例子3人就是排队报数为(1,2,3,),1号和3号换位置写法(3,2,1,),换完后位置后报数还是(1,2,3,),并不是(3,2,1).

6 回复 有任何疑惑可以回复我~
#1

慕九州2485307

为什么要换位置呢?请问换位置的逻辑在哪里?
2018-12-07 回复 有任何疑惑可以回复我~
#2

Mr_黄黄 回复 慕九州2485307

你想明白这个,你需要明白汉诺塔的规则,我最初不懂什么是汉诺塔,疑惑了很久
2019-01-25 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
初识Python
  • 参与学习       758623    人
  • 解答问题       8667    个

学python入门视频教程,让你快速入门并能编写简单的Python程序

进入课程

对于标准答案的递归很多人都看不懂,其实就是一个深度优先的遍历。我写了段伪代码,将递归步骤还原并注释了一下,供大家参考,希望大家有所收获。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信