无法理解河内塔楼的python代码

时间:2016-05-06 14:15:49

标签: python recursion

注意:我想要发布2张图片,但我没有足够的声誉:一个是代码输出,另一个是简单的图形,更好地定义了这个课程如何定义这个河内的塔问题

感谢代表,以便我现在可以发布图片。我已经发布了代码输出的图片,让您更好地了解河内塔的这种特殊配方本课程中提出的问题。此外,如果这个案例与以前对河内塔问题的答案不同,我希望它能帮助那些希望回答这个具体案例的人。

正如我在其他帖子中提到的,我正在学习编程主要是为了我的爱好。大约一个月前,我决定停止学习C和Java的地方,并开始从头开始学习。所以我发现了一些使用Python 2-7教授编程的在线课件。到目前为止,该课程很好,为我提供了我需要的基础。

我目前正在讨论课程中的递归问题,该课程中使用的一个问题是河内塔问题。我在理解递归在这个问题上是如何工作时遇到了一些麻烦。我理解递归是如何在类所涵盖的其他示例中完成的,例如Fibonacci序列和回文检查器,我没有遇到任何麻烦。

作为参考,我在下面发布了一个图表,说明了如何为这个例子制定河内塔问题:

由于我无法发布关于如何为此课程制定问题的图像,我将在文本中对其进行描述。

  • n戒指从名为From的杆子开始并标记为' f'在代码中
  • 目标杆被标记为' t'在代码中
  • 备用杆标有' s'在代码中

解决问题的两条规则是:1)一次只能移动1个环,2)不能将较大直径的环放在较小直径的环上。

手动解决这个问题,我确定了以下解决方案:

  • 对于n = 2次戒指
  • 将f移至s
  • 将f移至t
  • 将s移至t

以下是n = 3次戒指:

  • 将f移至t
  • 将f移至s
  • 将t移至s
  • 将f移至t
  • 将s移至f
  • 将s移至t
  • 将f移至t

下面是用于在右侧解决此问题的python代码和左侧shell中的输出的图形:

def Hanoi(n,f,t,s,indent = '   '):
    print indent, 'Hanoi called with n = ' + str(n)
    ##print n
    if n == 1:
        print indent, 'move from ' + f + ' to ' + t
    else:
        Hanoi(n-1,f,s,t,indent+indent)
        print indent, 'here'
        Hanoi(1,f,t,s,indent+indent)
        print indent, 'there'
        Hanoi(n-1,s,t,f,indent+indent)
        print indent, 'anywhere'

在代码中,教授提到使用print语句和缩进来尝试帮助人们更好地理解递归是如何工作的。这个策略帮助我更好地理解斐波那契和回文的例子,但我仍然遇到这个问题。

代码输出:

enter image description here

正如您在输出中所看到的,n = 2和n = 3的移动序列与"手动解决方案" 一致。我想我理解n = 2的输出是如何由代码生成的...但是对于n = 3,我正在努力。特别是对于绿色括号A中的代码,我不明白"是如何从t移动到s"是输出。我在代码中的任何地方都没有看到" t"可以是该print语句中的第一个输出!类似地,对于绿色括号B中的代码,我不知道" s"可以是第一个输出和" f"印刷的移动声明中的第二个输出......

我很感激任何可以帮助我更好地理解递归如何解决这个问题的输入。

2 个答案:

答案 0 :(得分:0)

Rahn提供的链接可以为您提供帮助,不过这是我对您的疑虑的评论:

  • 在第一个print语句中包含From,Target和Spare极点的标签。这应该可以帮助你认识到正在发生的事情。

    print '{0}Hanoi called with n = {1}. Moving from "{2}" to "{3}", using "{4}" as spare'.format(indent, n, f, t, s)
    
  • 请注意,当它不是基本情况(n = 1)时有3个步骤,并且它们使用较小的问题实例(n = n-1和n = 1)调用Hanoi函数:

    1)使用F作为from,S作为目标,T作为备用,解决n-1问题。此步骤将在F上留下第n个(此递归步骤的最大值)环,并在S中留下其他(n-1)个环。

    2)使用F和T作为from和target来求解基本情况(n = 1)。此步骤将第n个环(最大)从F移动到T.

    3)使用S作为from,T作为目标,F作为备用,解决n-1问题。此步骤将第一步中留在S上的所有环移动到T.在此步骤结束时,最初在S上的n个环被放置在T上。

答案 1 :(得分:0)

在阅读了Rahn链接到的网页后,我现在明白了这一点:Towers of Hanoi Python

我喜欢这个问题,在“移动塔”或“移动光盘”时特别提到的代码。此外,在问题的最高投票答案中,打印语句和跟踪高度和toPole,withPole和fromPole值也帮助我理解递归是如何工作的。为了进一步澄清,我在条件测试中添加了如果高度== 0和一条打印线,说明要进一步说服自己。