用ASCII说明河内塔

2024-10-06 11:55:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我熟悉河内大厦的递归函数。在

现在我需要可视化的运动,用星号表示碟片(我想碟片编号=星号的数目是有意义的)。在

有没有人有一个提示或例子,说明如何使用

        *                           
       ***                        ***
      *****                      *****            *
     --------------------       -----------------------     ...    

还是类似的?在

这是我的教授提供的示例代码,我确实理解递归是如何工作的。但是在一次Python讲座之后,我不得不说我对可视化任务有些不知所措。在

^{pr2}$

我们将非常感谢您的帮助!在


Tags: 代码示例可视化星号编号例子讲座意义
1条回答
网友
1楼 · 发布于 2024-10-06 11:55:57

正如philipp提到的,你需要一个国家的概念。在

状态可以用多种方式表示,但最终目标是打印到屏幕上的X乘Y字符网格。在

例如,如果我们想打印

  *
 ***
*****

我们可以在代码中以3x5数组的形式存储它。在

^{pr2}$

然后你可以循环这个并打印它。在

for row in state:
    for character in row:
        print(character, end='')

一条丑陋的捷径

print('\n'.join(''.join(y) for y in x))

如果你把它想象成电影,动画的每一帧都是X乘Y数组。每一帧也是代码中的打印语句之一。难点在于将一个动作(如“从1移动到3”)转换为状态表示。在

如果我们使用X乘Y数组作为状态,则很难从space1移动到space2,因为字符数组不会告诉您在space1中有多少个环以及环有多大。这表明我们需要一个更好的州。在

这是非常开放的,但是一个解决方案是,如果我们应用面向对象的编程,我们可以定义环和塔对象,其中塔是环的集合。因此,操作会在塔之间移动环,环和塔对象的状态用于创建X乘Y数组。在

我会很懒,把一个环表示为整数,而towers是一个3deques的数组。初始状态可以看起来像

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)

最后,您需要从towers/rings状态转换为可打印的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

最后,我们希望将这些塔组合成一个可打印的数组。您可以使用zip进行此操作。在

def render_final(塔楼): 塔楼结果=[] 塔内塔架: 塔楼_结果.append塔(渲染塔) 结果=[] 对于zip中的所有行(结果): 结果.追加(''.join(所有行)) 返回结果

现在您应该能够打印出结果并看到动画的帧。在

这会帮助你走上正轨。以上代码未经测试,请将其视为伪代码。我也不建议使用整数和deques列表作为您的状态,因为这无助于代码清洁。在

还有一件事,如果你打印出结果,它不会很漂亮,因为文本将打印并向下滚动。但是,如果使用内置的curses库,则可以获得漂亮的输出。在

相关问题 更多 >