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

参考代码的含义

参考代码中

“move(n-1, a, c, b)

    print a, '-->', c

    move(n-1, b, a, c)”

这一段的含义我不明白,有下面几个问题

1,print a, '-->', c中的 “a”与“c” 在“move(n-1, a, c, b)”这行代码中分别是后者的‘a’与‘b’吗?

2,第一行的n-1与第三行的n-1是不是同一个数字?

3,这两个move是如何实现循环运算的?

正在回答

1 回答

def move(n, a, b, c):
    if n == 1: #如果a只有一个圆盘,可以直接移动到c;
        print(a ,'->', c)
        return
    else:
        move(n-1,a,c,b) #首先需要把 (N-1) 个圆盘移动到 b
        move(1,a,b,c) #将a的最后一个圆盘移动到c
        move(n-1,b,a,c) #再将b的(N-1)个圆盘移动到c
        
move(4, 'A', 'B', 'C')

这个问题之前也是困扰了我很久,仔细琢磨一下,还是可以理解的,这个例子对于理解递归函数是很不错的。

首先,假设,这个函数只解决了一个问题,就是只有一个盘子的情况下,A——>C。

递归函数就是要不断的调用函数自身,以达到将问题化整为零,最小段进行解决。也就是,就算有N个盘子,也要进行自身调用,将N个盘子的情况,至变成N个1个盘子的情况下,进行解决。

在整个变化中,唯一始终不变的就是n==1的情况A——>C,既然如此,对于变化就要在else中对需要变换的位置进行调换。例如 

move(n-1 , a , c , b) #第一个N-1的情况进行调用的时候
      |    |   |   |   #上下对比可以看出,b出现在了固定参数c的位置
move(  n , a , b , c) #调用的N=1的情况,固定参数位置

然而 N=1的情况下结果就是

print(a ,'->', c)

由此看出,最后运行的结果就是 A——>B,如此就符合了第一个出现的N-1的情况,以此类推。

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

Icarusxuxx 提问者

感谢你的解答 不过我还有一点不明白,在这个代码中似乎没有体现如何实现“小盘子上方不能放大盘子”这个限制 为什么可以输出正确的结果呢?
2018-07-03 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

参考代码的含义

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