首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >难以理解河内塔的python代码

难以理解河内塔的python代码
EN

Stack Overflow用户
提问于 2016-05-06 14:15:48
回答 2查看 626关注 0票数 2

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

谢谢你的代表,所以我现在可以发布图片了。,我已经发布了代码输出的图像,以便让您更好地了解在本课程中介绍的河内塔问题的这个特殊公式。此外,如果这个案件与以前河内塔问题的答案不同,我希望它能帮助那些希望回答这一具体案件的人。

正如我在其他帖子中提到的,我学习编程主要是为了我的爱好。大约一个月前,我决定停止学习C和Java,从地面开始学习。所以我找到了一些用Python2-7教编程的在线课件。到目前为止,这门课程做得很好,为我提供了我需要的基础。

我目前正在讨论本课程中的递归问题,类作为示例使用的问题之一是河内问题。我很难理解递归是如何在这个问题上工作的。在类所涵盖的其他示例中,例如Fibonacci序列和回文检查器,我在理解递归是如何工作的方面没有任何问题。

作为参考,我在下面张贴了河内塔问题是如何为这个例子制定的图表:

由于我不能发布这个问题是如何为这门课制定的图片,我将用文本描述它。

  • N个环从极点开始,在代码中调用f并标记'f‘。
  • 目标极点在代码中被标记为t。
  • 备用杆在代码中被标记为's‘

解决这一问题的两个规则是: 1)一次只能移动1个环;2)大直径环不能放置在较小直径环的顶部。

通过手工解决这一问题,我确定了以下解决方案:

  • N=2环
  • 移动f到s
  • 移动f到t
  • 移到t

以下为n=3个环:

  • 移动f到t
  • 移动f到s
  • 将t移动到s
  • 移动f到t
  • 移动s到f
  • 移到t
  • 移动f到t

下面是用于解决右侧这个问题的python代码的图形,以及左侧shell中的输出:

代码语言:javascript
复制
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语句和缩进来帮助人们更好地理解递归是如何工作的是个好主意。这个策略帮助我更好地理解Fibonacci和回文示例,但我仍然在这个问题上遇到麻烦。

代码输出:

正如您在输出中所看到的,移动n=2和n=3的序列与“手动解决方案”一致。我想我理解n=2的输出是如何由代码生成的.然而,对于n=3来说,我正在挣扎。特别是对于绿色括号A中的代码,我不明白“从t到s”是如何输出的。我看不到代码中的"t“是打印语句中的第一个输出!类似地,对于绿色括号B中的代码,我看不出"s“是第一个输出,而"f”是打印的move语句中的第二个输出.

我希望任何能帮助我更好地理解递归是如何解决这个问题的输入。

EN

回答 2

Stack Overflow用户

发布于 2016-05-07 14:56:38

拉恩提供的联系应该对你有帮助,不过,以下是我对你所关心的问题的评论:

  • 在第一个打印语句中包括From、Target和备用极点的标签。这应该能帮助你认识到发生了什么。 使用n= {1}调用“{0}河内”。从"{2}“移动到"{3}",使用"{4}”作为备用.格式(缩进,n,f,t,s)
  • 注意,当它不是基本情况(n=1)时,有3个步骤,它们使用问题的较小实例(n=n-1和n=1)调用Hanoi函数: 1)以F为起点,S为目标,T为备用,解决了n-1问题。这一步将在F上留下n个(这个递推步骤的最大)环,在S中留下另一个(n-1)环。 2)以F和T作为起始和目标,求解基例(n=1)。这一步将n个环(最大的)从F移动到T。 3)以S为起点,T为目标,F为备用,解决了n-1问题。这一步将把第一步留下的所有环移到T上,在这一步的末尾,原来在S上的n个环被放置在T上。
票数 0
EN

Stack Overflow用户

发布于 2016-05-08 13:55:07

在阅读了Rahn链接到的网页之后,我现在了解了这个页面上的程序:Towers of Hanoi Python

我喜欢在这个问题中,当代码“移动塔”或“移动光盘”时,代码是如何被特别调用的。此外,在顶部投票回答问题时,打印语句和对高度以及toPole、withPole和fromPole值的跟踪也帮助我理解递归是如何工作的。为了进一步澄清,我添加了一个条件测试是否高度== 0和打印行说明,以进一步说服自己。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37074708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档