Python 用ASCII码说明河内塔
我熟悉河内塔的递归函数 现在,我需要可视化运动,用星号表示光盘(我想光盘编号=星号编号是有意义的) 是否有人有一个提示或示例,说明如何使用Python 用ASCII码说明河内塔,python,recursion,ascii,visualization,towers-of-hanoi,Python,Recursion,Ascii,Visualization,Towers Of Hanoi,我熟悉河内塔的递归函数 现在,我需要可视化运动,用星号表示光盘(我想光盘编号=星号编号是有意义的) 是否有人有一个提示或示例,说明如何使用 * *** *** ***** ***** * -------------------- ---------------------
*
*** ***
***** ***** *
-------------------- ----------------------- ...
还是类似的
这是我的教授提供的示例代码,我确实理解递归的工作原理。但在一次Python讲座之后,我必须说我对可视化任务有些不知所措
def hanoi(n, p1, p2, p3):
if n==1:
print("move from %d to %d" %(p1, p3))
else:
hanoi(n-1, p1, p3, p2)
print("move from %d to %d " %(p1, p3))
hanoi(n-1, p2, p1, p3)
return
if __name__=='__main__':
j=int(input('Input the number of disk to be moved:\n'))
print('Number of disk to be move is %d \n'%j)
hanoi(j, 1, 2, 3)
非常感谢您的帮助 正如Phi Lipp所提到的,你需要对国家有一个概念 状态可以用多种方式表示,但最终目标是打印到屏幕上的X×Y字符网格 例如,如果我们想打印
*
***
*****
我们可以将其作为3x5数组存储在代码中
[
[' ', ' ', '*', ' ', ' '],
[' ', '*', '*', '*', ' '],
['*', '*', '*', '*', '*'],
]
然后你可以在上面循环并打印它
for row in state:
for character in row:
print(character, end='')
一条丑陋的捷径是
print('\n'.join(''.join(y) for y in x))
现在,如果你把它想象成一部电影,你的动画的每一帧都是X X X Y阵列。每个帧也是代码中的一个打印语句。难点在于将动作(例如“从1移动到3”)转换为状态表示
如果我们使用X X X Y数组作为状态,则很难从space1移动到space2,因为字符数组不能告诉您space1中有多少个环以及环有多大。这表明我们需要一个更好的国家
这是非常开放的,但有一个解决方案是,如果我们应用面向对象编程,我们可以定义环和塔对象,其中塔是环的集合。因此,动作会在塔之间移动环,环和塔对象的状态用于创建X X X Y阵列
我会很懒,把一个环表示成一个整数,塔是一个3的数组。初始状态可以类似于
from collections import deque
towers = [deque([1,2,3]), deque(), deque()]
现在您需要一个从U塔移动到V塔的功能:
def move_ring(from, to):
top_ring = from.popleft()
to.append(top_right)
最后,您需要从塔/环状态转换为可打印的X×Y阵列。一次渲染每个塔和其中的每个环会更容易:
def render_ring(ring):
result = '*' * ring # the character * repeated ring times.
return result.center(user_input) # add the spaces required
def render_tower(tower):
result = []
for ring in tower:
result.append(render_ring(ring))
return result
最后,我们要将这些塔合并成一个可打印的阵列。你可以用这个
def渲染_最终版(塔楼):
塔_结果=[]
对于塔楼中的塔楼:
塔楼结果。附加(渲染塔楼(塔楼))
结果=[]
对于zip中的所有_行(结果):
result.append(“”.join(所有_行))
返回结果
现在,您应该能够打印出结果并查看动画的帧
这将帮助你走上正确的轨道。请将上述代码视为伪代码,因为它未经测试。我也不建议使用整数和DEQUE列表作为状态,因为这不会有助于代码的整洁
还有一件事,如果你打印出结果,它将不好看,因为文本将打印并向下滚动。但是,如果使用内置库,您可以获得漂亮的输出。这是一个有点复杂的问题,因为您显示的
hanoi
函数没有任何状态概念(它只是以特定模式移动)。要真正绘制电路板,您需要知道所有磁盘都在哪里,而不仅仅是要在哪些帖子之间移动。你试过可视化方面的东西了吗?仅仅能够绘制初始状态将是一个良好的开端。事实上,这个问题可能太宽泛了(你实际上是在要求我们为你做家庭作业)。谢谢馄饨的详细回答,这给了我一个想法,我可以应用更改。似乎我无法执行以“from”作为参数的函数,因为它在红色的“def”下加下划线,并给出错误“无效语法”。那是从哪里来的?