注意:我想要发布2张图片,但我没有足够的声誉:一个是代码输出,另一个是简单的图形,更好地定义了这个课程如何定义这个河内的塔问题
感谢代表,以便我现在可以发布图片。我已经发布了代码输出的图片,让您更好地了解河内塔的这种特殊配方本课程中提出的问题。此外,如果这个案例与以前对河内塔问题的答案不同,我希望它能帮助那些希望回答这个具体案例的人。
正如我在其他帖子中提到的,我正在学习编程主要是为了我的爱好。大约一个月前,我决定停止学习C和Java的地方,并开始从头开始学习。所以我发现了一些使用Python 2-7教授编程的在线课件。到目前为止,该课程很好,为我提供了我需要的基础。
我目前正在讨论课程中的递归问题,该课程中使用的一个问题是河内塔问题。我在理解递归在这个问题上是如何工作时遇到了一些麻烦。我理解递归是如何在类所涵盖的其他示例中完成的,例如Fibonacci序列和回文检查器,我没有遇到任何麻烦。
作为参考,我在下面发布了一个图表,说明了如何为这个例子制定河内塔问题:
由于我无法发布关于如何为此课程制定问题的图像,我将在文本中对其进行描述。
解决问题的两条规则是:1)一次只能移动1个环,2)不能将较大直径的环放在较小直径的环上。
手动解决这个问题,我确定了以下解决方案:
以下是n = 3次戒指:
下面是用于在右侧解决此问题的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语句和缩进来尝试帮助人们更好地理解递归是如何工作的。这个策略帮助我更好地理解斐波那契和回文的例子,但我仍然遇到这个问题。
代码输出:
正如您在输出中所看到的,n = 2和n = 3的移动序列与"手动解决方案" 一致。我想我理解n = 2的输出是如何由代码生成的...但是对于n = 3,我正在努力。特别是对于绿色括号A中的代码,我不明白"是如何从t移动到s"是输出。我在代码中的任何地方都没有看到" t"可以是该print语句中的第一个输出!类似地,对于绿色括号B中的代码,我不知道" s"可以是第一个输出和" f"印刷的移动声明中的第二个输出......
我很感激任何可以帮助我更好地理解递归如何解决这个问题的输入。
答案 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和一条打印线,说明要进一步说服自己。