【发布时间】:2021-07-06 05:58:18
【问题描述】:
我正在实现经典河内塔问题变体的递归解决方案,您只能在相邻钉之间移动磁盘才能解决它。我的近似值是这样的:
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
【问题讨论】:
-
当初始左塔有 4 个圆盘时,你能给出预期的完整输出吗?
-
@trincot 我编辑了添加 2-discs case 的问题(因为 4 会更长)。
-
谢谢,但我真的很想看到你用 4 张光盘来做这件事,因为这似乎是不可能的。另外,在您只有 2 张光盘的示例中,我不明白为什么要完成最后一步?在此之前目标不是已经实现了吗?
-
为什么在
else分支中,钉子的默认值总是正确的?为什么,使用 ode 调用 2 打印基本案例和另外 3 个打印,您会期望 8 个? -
@greybeard 这是我的问题,我不知道如何向算法添加功能以便向左移动
标签: python python-3.x algorithm recursion towers-of-hanoi