python - 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
解决方案
有了这个限制,宇宙将看到更长的生命:
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)
推荐阅读
- amazon-web-services - 限制 cognito 用户组的用户访问 API 网关端点
- java - 警告 org.apache.kafka.clients.NetworkClient - [Producer clientId=producer-1] Bootstrap broker 127.0.0.1:9092 (id: -1 rack: null) 已断开连接
- java - 如何将与布尔变量匹配的 int 变量和字符串变量放入 .equals() 中?
- scala - 当类型类中有类型类时,使用类型类语法的正确方法是什么?
- java - 如何为具有时间戳值的实体类创建 Gson 对象?
- jenkins - 如何在 Jenkins 管道中使用动态数据构建并行和顺序阶段的组合
- java - 有效地将长格式 (yyyyMMddHHmmss) 的 DateTime 转换为另一个区域以进行比较
- zsh - iTerm2 在终端上显示一些数字
- html - 为什么带有供应商前缀的 flexbox、justify-content 在 Safari 中不起作用?
- reactjs - 优化应用程序的路由和 React 延迟加载,登陆页面上有 2 个部分