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”下加下划线,并给出错误“无效语法”。那是从哪里来的?