2014-03-14 63 views
0
def hanoi(n,src,dsc,aux): 
    if n == 1: 
     print_move(src,dsc) 
    else: 
     hanoi(n-1,src,aux,dsc) 
     print_move(src,dsc) 
     hanoi(n-1,aux,dsc,src) 

def print_move(src,dsc): 
    print("Move the top disk from",src,"to",dsc) 

我希望的河內代碼以上塔改變,以輸出一個元組的移動,當順序執行將通過輔助極所有從源極的磁盤移動到目的地極。磁盤移動被定義爲一對兩個數字:源極和目標極。例如,(1, 3)表示磁盤從第一極移動到第三極。因此,hanoi(2,1,3,2)將輸出((1,2),(1,3),(2,3))塔河內 - 的移動的元組

我的方法是創建一個全局變量,稱爲tup,一個空元組。然後,無論何時創建新的元組移動,它都將被添加到tup。我的問題是我不知道什麼時候我應該返回的tup值以及其中hanoi功能裏面我可以把return線。

+0

不能添加東西變成一個元組,但你可以返回一個列表,如果你願意,可以用'tuple(result)'將它轉換爲一個元組,但是我想你想要的是一個列表。 – justhalf

回答

1

在遞歸函數來實現這一目標的最佳途徑通常是這樣的:(注意用None,以避免與可變默認參數問題)

def hanoi(..., out=None): 
    if out is None: 
     out = [] # list to store output 
    ... 
    print_move(src, dsc) 
    out.append((src, dsc)) # add result to output 
    ... 
    hanoi(..., out) # call recursively and ignore return 
    ... 
    return out # return output 

,並呼籲時:

results = hanoi(...) 

這樣一個單一的列表out被共享並添加到所有級別的遞歸調用。每次調用都會忽略來自深層調用的返回值,因爲它們可以訪問同一列表,但頂層的調用者從各級返回輸出。

列表是存儲不是一個元組一個更好的主意,因爲列表是可變的,但一兩元組的每個舉動似乎是合理的:

results == [(1, 2), (1, 3), (2, 3)] 
+0

對不起,我不太瞭解你的解決方案。你可以用河內函數來解釋它嗎? – user2396041

+0

我改變了一些名字,但是原理與遞歸函數的確切性質無關。 – jonrsharpe