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

程序没看懂 输出的答应是看懂了

https://img1.sycdn.imooc.com//5cae878b00014e0703060166.jpg

最后的这个 print a, '-->', c 这个完全不理解 麻烦大神把整个程序解释一下  谢谢了。

正在回答

6 回答

写错了 是print a-->b

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

def move(n, a, b, c):

    if n ==1:

        print a, '-->', c    #1.1 一个圆盘直接从A放到C

        return

    move(n-1, a, c, b)    #2.1 先将n-1个盘从A放到B

    print a, '-->', c     #2.2 然后把A剩余的1个盘从A放到C

    move(n-1, b, a, c)    #2.3 最后把从A放到B的那n-1个盘从B放到C

    

move(3, 'A', 'B', 'C')

看备注感觉好简单,但是这个程序运行的流程还得细细研究

move(4,a,b,c)

n=4 ,所以if不运行

运行 move(3,a,c,b)#目的是把3个盘子放到b

进入move(3,a,c,b)中,n'=n-1=3,if不运行

运行move(2,a,b,c)#目的是把2个盘子放到c

进入move(2,a,b,c)中,n''=n'-1=n-2=2,if不运行

运行move(1,a,c,b)#目的先把一个盘子放到a

n'''=1,运行if,打印出 print a-->c

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


move(3,'A','B','C')  

move(n,a,b,c) #第一次调用 传值'A','B','C' 此时n=3,a='A',b='B',c='C'这几个值在本次调用中都不变

    #if(n == 1) n=3不走

    move(n-1,a,c,b)  #调用主函数,传值n=2,a='A',c='C',b='B',将值传入,注意传入的是值,将2,'A','C','B'按位置传下去,也就是move(2,'A','C','B') 

        move(n,a,b,c) #此处进入第一层循环 用值a='A',b='C',c='B' 此时n=2,a='A',b='C',c='B'循环 这几个值在本层调用中都不变

        if n ==1

            print(a,'-->',c)   # n!= 1   跳过

            return

        move(n-1,a,c,b)    #此时传参 传入 a=A ,b= C ,c=B   得到 a=Ab=Bc=C,  即 move(1,A,B,C),进入第二层循环

            move(1,a,b,c)  #   用参  move(1,A,B,C)

            if n== 1

                print( # 此时n=1,打印 a-->c   即 A-->C

                return

        print(a , '-->', c)   # 此处回到第一层循环第一次递归,即 move(2,a,b,c)  实参是 move(2,A,C,B),即打印 A-->B

        move(n-1,b,a,c)       #第二层循环最后一步, 实参是a=A,b=C,c=B ,则 move(1,=C,A,B)

            move(n, a,b,c)    # 用参 按位置 代入实参 move(1,=C,A,B)

            if n==1:

                print(a,'-->',c)   # n=1 打印 a-->c,   即C-->B

                return                 ##  return函数, 所以第二层执行完了,回到move(3, a, b, c)

            

    print (a , '-->', c)   #  函数实参move(3,A,B,C)  ,即 打印 A-->C

    move(n-1, b, a, c)     # 传参,move(2,B,A,C)

        move(2,a,b,c)       #  用参得到 a= B  ,  b=A  , c=C   move(2,B,A,C)

        if n==1:

            print(a, '-->', c)  # n!= 1   跳过

            return

        move(n-1, a, c, b)    # 传入实参 move(2,B,A,C) 得到 move(1,B,C,A)

            move(n, a, b, c)    # 用参  move(1,B,C,A)

            if n==1:

                print(a, '-->', c)      # n==1 打印 a-->c   即 B-->A

                return

        print(a,'-->',c)      #即   B-->C

        move(n-1,b,a,c)   #   传参 a= B  ,  b=A  , c=C,得出新函数 move(1,A,B,C)

            move(1,a,b,c)   # 用参

            if n==1:

                print(a,'-->',c)  # n=1 打印a-->c    即 A-->C

                return


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

你可以理解为有上面盘子的是A,有下面盘子的是C,空的那个是B,实际上是通过赋值一直在变的

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

第一个 move(n-1,a,c,b) 表示的是把底盘上面的n-1块圆盘从 a移动到b

然后 再把底盘从 a 移动到 c  即 print a--->c

第二个move(n-1,b,a,c) 表示把放在b上的n-1个圆盘移动到c上,实现了整个程序

而这个 move(4, 'A', 'B', 'C') 表示的是调用这个函数,把参数给传递进去。


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

Love牙牙

求问,move(4, 'A', 'B', 'C'),这里参数4,是不是代表有4块圆盘?4块圆盘的移动,这三步感觉没完成啊,怎么实现的?递归吗
2019-04-26 回复 有任何疑惑可以回复我~
#2

陈大隐

回复 Love牙牙就是通过递归实现的呀,参数4就是表示4块圆盘。 你只需要知道可以这样实现,并不需要知道它们内部是如何实现的。
2019-04-27 回复 有任何疑惑可以回复我~

这个打印其实就是打印出每一个步骤啊,你每次传进去的值是不一样的,相当于,你把圆盘从哪一个柱子移动另外的一个柱子

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

举报

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

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

进入课程

程序没看懂 输出的答应是看懂了

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