Discuss / Python / 一点想法

一点想法

Topic source

班门弄斧一下,借用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。

optics_lz

#2 Created at ... [Delete] [Delete and Lock User]

很透彻,牛逼!

Kzkkzkgxggxg

#3 Created at ... [Delete] [Delete and Lock User]

很好的解释,十分感谢大神

AlexTyrant

#4 Created at ... [Delete] [Delete and Lock User]

不对吧,汉诺塔问题中有规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。所以不存在一次性移入到缓冲区的可能啊。而且代码运行效果也不是这样的。 个人觉得是奇数个圆盘还是偶数个圆盘直接影响第一步走法 奇数走A-C 偶数走 A-B。

H炜彬丶

#5 Created at ... [Delete] [Delete and Lock User]

没有把大的放小的上面,是先把除了最后一个大的留着,然后给b,再把最大的给c,再从B上移到c上

游戏规定了一次只能移动一个圆盘呀,不能把n-1个盘子直接给B。

真实厉害呀,解释的非常透彻

陈灿Cedric

#8 Created at ... [Delete] [Delete and Lock User]

diao diao diao !!!

陈灿Cedric

#9 Created at ... [Delete] [Delete and Lock User]

@六楼,他程序里设定了只有n为1的时候才会print,所以输出的结果就是一个一个盘子来移动的。b把n-1个盘子移到c是宏观任务,但具体细分下来的每一步都是移动单个盘子实现的。可以跑一下程序,依次设定n=1,n=2,n=3看看结果方便理解


  • 1

Reply