一点想法
Topic source不对吧,汉诺塔问题中有规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。所以不存在一次性移入到缓冲区的可能啊。而且代码运行效果也不是这样的。 个人觉得是奇数个圆盘还是偶数个圆盘直接影响第一步走法 奇数走A-C 偶数走 A-B。
@六楼,他程序里设定了只有n为1的时候才会print,所以输出的结果就是一个一个盘子来移动的。b把n-1个盘子移到c是宏观任务,但具体细分下来的每一步都是移动单个盘子实现的。可以跑一下程序,依次设定n=1,n=2,n=3看看结果方便理解
- 1
没脑子的外星宠物猫
班门弄斧一下,借用1楼程序
def move(n, a, b, c): if n == 1: print(a,'-->',c) else: move(n-1,a,c,b) move(1, a, b, c) move(n-1,b,a,c) 首先给函数名中的abc下一个定义:a=操作区;b=缓冲区;c=目标区 这样程序可以改为 : move(n,操作区,缓冲区,目标区)
我们的目的:将 操作区 的数移动到 目标区 里,所以函数执行只有一句话:操作区--->目标区
第一步:将 操作区a 前n-1个数移动到 缓冲区b 里,这时 缓冲区b 就是我们这一步的目标区;所以是move(n-1,a,c,b)
第二步:将 操作区a 的最后一个数移动到 目标区c 里,即move(1, a, b, c)
注意: 这时,操作区a的东西已经全部移动到缓冲区b和目标区c里了,操作区a已经为空了。 所以现在,缓冲区b就成为了新的操作区(里头有m=n-1个数),而之前的操作区a成为了新的缓冲区
所以第三步是将a、b交换后再一次执行move函数,即 move(m,b,a,c),并且此时m=n-1。