首页 > 解决方案 > Python中的递归河内塔变体

问题描述

我正在实现经典河内塔问题变体的递归解决方案,您只能在相邻钉之间移动磁盘以解决它。我的近似值是这样的:

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

标签: pythonpython-3.xalgorithmrecursiontowers-of-hanoi

解决方案


有了这个限制,宇宙将看到更长的生命:

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)

推荐阅读