我正在实现一个递归解决方案,它是经典河内塔问题的变体,您只能在相邻钉子之间移动磁盘以解决它。我的近似值是这样的:
def hanoi_variation(n_disks, peg_1=1, peg_2=2, peg_3=3):
if n_disks == 1:
print('Move {} from peg {} to {}'.format(n_disks, peg_1, peg_2))
print('Move {} from peg {} to {}'.format(n_disks, peg_2, peg_3))
else:
hanoi_variation(n_disks - 1)
print('Move {} from peg {} to {}'.format(n_disks, peg_1, peg_2))
print('Move {} from peg {} to {}'.format(n_disks-1, peg_3, peg_2))
print('Move {} from peg {} to {}'.format(n_disks-1, peg_2, peg_1))
我知道它需要是一个序列,其中最小的磁盘首先向右移动两次,然后第二个向右移动一次,第一个向左移动......但是对于此实现,它仅在第一次迭代时有效。有什么想法吗?
提前谢谢。
编辑:2 张初始光盘的预期输出(我认为是基本情况)必须是:
Move 1 from peg 1 to 2
Move 1 from peg 2 to 3
Move 2 from peg 1 to 2
Move 1 from peg 3 to 2
Move 1 from peg 2 to 1
Move 2 from peg 2 to 3
Move 1 from peg 1 to 2
Move 1 from peg 2 to 3
我得到的是:
Move 1 from peg 1 to 2
Move 1 from peg 2 to 3
Move 2 from peg 1 to 2
Move 1 from peg 3 to 2
Move 1 from peg 2 to 1
在这个限制下,宇宙将看到更长的生命:
p a
e bbb aa aa
g ccccccccc aa bbbbbb aa aa
1 ddddddddddddddddddddddddddd aa bbbbbb
p a
e a a a bb
g a a bbb a a a bbb a ccccc
2 a bbb a ccccccccc a bbb a dddddddddddddd
p
e aa
g aa aa bbbbbb aa
3 aa bbbbbb aa cccccccccccccccccc aa
非递归过程:
第一步别无选择。
在此后可能的两个移动中,选择不撤消前一个的移动。
递归过程:
"""
Towers of Hanoi.
Moves restricted to neighbouring peg
implement pegs begin, mid, end and procedure move() to meet your needs
"""
# loads of empty lines for spoiling
def towers_of__H_a_n_o_i(d, source=begin, destination=end, other=mid):
"""
Towers of Hanoi.
Moves restricted to neighbouring peg
"""
if d < 1: return
if mid == other:
towers_of__H_a_n_o_i(d-1, source, destination)
move(source, other)
towers_of__H_a_n_o_i(d-1, destination, source)
move(other, destination)
towers_of__H_a_n_o_i(d-1, source, destination)
else:
towers_of__H_a_n_o_i(d-1, source, other, destination)
move(source, destination)
towers_of__H_a_n_o_i(d-1, other, destination, source)