2016-05-06 106 views
2

注意:我有2張圖片需要發佈,但我沒有足夠的信譽:一個是代碼輸出,另一個是更簡單的圖形,可以更好地定義此課程定義了這個河內的塔的問題。瞭解河內塔的Python代碼時遇到的問題

感謝代表,讓我現在可以發佈圖像。我已經發布了代碼輸出的圖像,以便您更好地瞭解此課程中介紹的河內塔問題的特定形式。此外,如果這個案例與以前對河內塔問題的答案不同,我希望它能幫助那些希望回答這個具體案例的人。

正如我在其他職位中提到的,我正在學習編程主要是爲了我的愛好。大約一個月前,我決定停止學習C和Java,並開始從頭開始學習。所以我找到了一些在線課件,教導使用Python 2-7進行編程。到目前爲止,該課程做得很好,爲我提供了一個我需要的基礎。

我目前關於課程遞歸的問題,以及班上用作示例的問題之一是河內塔問題。我在理解遞歸在這個問題中的工作方面遇到了一些麻煩。我沒有理解遞歸在其他例子中如何工作,例如Fibonacci序列和迴文檢查器。

僅供參考,我下面貼的如何河內塔問題的配製在這個例子中的圖形:

因爲我不能發佈的問題是如何制定這個類的圖像,我會形容它在文本中。

  • N次響鈴上磁極稱爲從和在代碼
  • 目標極標記「F」開始在代碼在代碼標記爲「T」
  • 備用極被標記爲「S」

解決這個問題的兩個規則是:1)一次只能移動1個環,2)不能在直徑較小的環上放置一個直徑較大的環。

工作這一點通過手,我確定以下解決方案:

  • 對於n = 2個環
  • 將f爲s
  • 將f到t
  • 移動s到Ť

以下爲n = 3個環:

  • 將f到t
  • 將f爲s
  • 移動噸爲s
  • 將f到t
  • 移動s至˚F
  • 移動s到Ť
  • 將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' 

在代碼中,教授提到使用打印語句和縮進來嘗試幫助人們更好地理解遞歸如何工作是一個好主意。該策略幫助我更好地理解斐波納契和迴文的例子,但是我仍然遇到這個問題。

代碼輸出:

enter image description here

正如可以在輸出中看到,對於移動序列兩個n = 2和n = 3與 「通過手溶液」同意。我想我明白了代碼生成n = 2的輸出是如何產生的......但是,對於n = 3,我掙扎着。特別是對於綠色括號A中的代碼,我不明白「從t移動到s」是如何輸出的。我沒有看到代碼中的任何地方,「t」如何成爲該打印語句中的第一個輸出!同樣,對於綠色托架B的代碼,我不看「的」如何能夠在第一輸出和「F」,在印刷舉動語句中的第二輸出...

我會很感激的任何信號輸入,可以幫助我更好地理解遞歸如何解決這個問題。

+1

檢查http://stackoverflow.com/questions/1223305/tower-of-hanoi-recursive-algorithm – Wentao

+0

@Rahn我會檢查出這個鏈接。 – PhilosophStein

回答

0

由拉恩所提供的鏈接可以幫助你,但這裏是我的關於您的問題的意見:

  • 包含的標籤從,目標和第一print語句備用極點。這應該有助於你識別發生了什麼。

    print '{0}Hanoi called with n = {1}. Moving from "{2}" to "{3}", using "{4}" as spare'.format(indent, n, f, t, s) 
    
  • 注意,有3個步驟時,它不是基例(N = 1),並且它們調用的河內功能的問題的更小的情況下(N = N-1和n = 1):

    1)解決了使用F作爲從,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.在這個步驟結束了所有環,n個戒指原本在S,被放置在T.

0

我現在明白了讀書後Rahn鏈接到此頁面上的此頁面上的網頁:Towers of Hanoi Python

我喜歡這個問題,代碼在「移動塔」或「移動光盤」時明確指出的代碼。此外,在這個問題的頂級投票答案中,打印語句和跟蹤高度以及極點,極點和極點值也幫助我理解遞歸如何工作。爲了進一步澄清,我在條件測試中添加了如果高度== 0和打印行,以進一步說服自己。