欢迎各界计算机爱好者加入,弘扬极客精神!

Python汉诺塔的逻辑

0 喜欢 0 不喜欢
用Python编译汉诺塔不清楚逻辑
最新提问 12月 4, 2016 分类:其他 | 用户: Zhangchi (2,280 分)  

4 个回答

1 喜欢 0 不喜欢
 
已采纳
其实逻辑是这样的,想让n个盘子在C上按顺序排好,首先得从A 中找到那个最大的盘子,现在在A 的最下面,所以那些除了最大的盘子的那一个之外的所有盘子都要被放在B上,所以得首先把这些n-1个盘子都放在B上,然后现在就可以把A上最大的盘子先放到C上,以此类推,直到C上有n-1个盘子,直接将A上的盘子放在C上,这样就结束了
最新回答 12月 5, 2016 用户: Liwenwen (5,162 分)  
采纳于 12月 5, 2016 用户:Zhangchi
1 喜欢 0 不喜欢
  1. def move(n,a,b,c):  
  2.     if n==1:  
  3.         print(a,'-->',c)  
  4.     else:  
  5.         move(n-1,a,c,b)   #将前n-1个盘子从a移动到b上  
  6.         move(1,a,b,c)     #将最底下的最后一个盘子从a移动到c上  
  7.         move(n-1,b,a,c)   #将b上的n-1个盘子移动到c上  
  8. move(3,'A','B','C')
最新回答 12月 4, 2016 用户: Cunese (6,866 分)  
1 喜欢 0 不喜欢

 

 

最新回答 12月 4, 2016 用户: ywen232625 (3,748 分)  
0 喜欢 0 不喜欢
首先明确,我们的目标是将A针上所有N个盘子移动至C针。而对于B针,我们可以将之看成一个中转站。 这个问题,顺向思维或者逆向思维道理是相同的,都太麻烦。我们不妨从中间开始思考。 ||: 规则要求小盘子必须在大盘子之上。试想这个过程中,必然会经历那么一个步骤,即有一大坨N-1个盘子在B针这个中转站,而我们正将最大那个盘子(即第N个盘子)从A针移动至C针。 只有经历“移动最大盘子”这个步骤,余下的事情才有可能实现。而在此之前,我们所要做的事情,就是让“移动最大盘子”这个步骤得以实现。 现在,游戏整个过程以“移动最大盘子”为中央,被分为了两部分。即(前)“将那坨N-1个盘子从A针移动到B针”,(中)“移动最大盘子”,(后)“将坨N-1个盘子从B针移动到C针”。 这是我们意识到,(前)与(后)操作道理是相似的。不去管那个最大盘子,(前)是以C针为中转站,(后)是以A针为中转站。因此两者所需的移动次数应当是相等的。这意味着我们只要计算出其中一者的移动次数,然而乘以2,在加上“移动最大盘子”的那1次,就是这场游戏的总移动次数了。 用数学语言表达,假设(前)“将N-1个盘子从A针移动到B针”所需次数为Hn-1,总移动次数为Hn,那么可以得出的关系就是:Hn=Hn-1 x 2 + 1. 其实当我们得出这个算式的时候,稍微聪明一点的人已经明白,这就是一个递推公式,可以直接用此公式得出Hn的通解。 但是LZ比较笨,就是不明白,为什么这个公式就可以套用呢? 那么就干脆继续思考吧。 让我们再想象一个情景:最大那个盘子在刚刚从A针被移动到C针,而那坨N-1个盘子还在B针蠢蠢欲动地等待着,即处于(中)->(后)的这个状态。 怎么移动这N-1个盘子呢? 其实这时候,问题已经回到了笔者标示“||:”符号的地方。“||:”是乐谱中的反复记号,而我们要做的,就是重复上面的步骤,但是要将N替换为N-1,因为现在只剩下N-1个盘子需要移动。而中转站则从B变成了A(鉴于这时盘子都在B针)。目标仍然是C针。下一次重复的时候,只剩下N-2个盘子需要移动,中转站又回到A,目标不变仍然是C针。……整个过程中,变化的只是中转站(在A与B之间轮换),以及剩下那些所需要移动的盘子的总数(越来越少)而已。 那么那个大盘子怎么办?不去管它吗?? 正解!! 因为你已经把它移到C针,已经完成了这个移动步骤,它不会影响之后的操作。提醒自己牢记游戏规则,大盘子永远在小盘子下面,而你也不需要再重复移动它——“不重复移动”,正是游戏规则的要求! 于是 Hn=Hn-1 x 2 + 1 这个公式,就可以套用、套用、套用……直到H3=7,H2=3,H1=1。
最新回答 12月 4, 2016 用户: 无奈ing (3,640 分)  
...