2016-08-31 24 views
-4

下面的代碼是一個遞歸函數,它接受兩個參數並返回類似[5,5,5]的內容。遞歸:設計一個名爲replicate_recur的遞歸函數,它將接收兩個參數:

def recursive(times, data): 
    if not isinstance(times,int): 
     raise ValueError("times must be an int") 
    if not (isinstance(data,int) or isinstance(data, str)): 
     raise ValueError("data must be an int or a string") 
    if times <= 0: 
     return [] 
    return [data] + recursive(times, data - 1) 

print(recursive(3, 5)) 

爲什麼代碼拋出遞歸錯誤?

回答

1

讓我們試着去思考我們如何將重複任何數據項N次遞歸:

  • 如果times爲小於或等於0,我們返回一個空列表,按要求。
  • 如果times大於0,則遞歸地返回具有data個和另一個times - 1數據重複的列表。

另一個要求是檢查參數的有效性,如果它們無效則引發ValueError。雖然這可以在相同的遞歸函數中完成,但這會帶來性能上的衝擊,因爲我們將執行相同的驗證times次。教科書的解決方案是將函數分成兩部分 - 處理驗證的「外部」函數和處理遞歸邏輯的「內部」函數。

把它放在一起,你會得到這樣的事情:

def replicate_recur(times, data): 
    if not isinstance(times, int): 
     raise ValueError("times must be an int") 

    return real_replicate_recur(times, data) 

def real_replicate_recur(times, data): 
    if times <= 0: 
     return [] 

    return [data] + real_replicate_recur(times - 1, data) 
0

您可以使用列表來存儲當前遞歸調用的結果。

def replicate_recur(times, data, ret=None): 
    if not ret: 
     ret = [] 
    ret.append(data) 
    times -= 1 
    if not times: 
     return ret 
    return replicate_recur(times, data, ret) 
+1

謝謝你們的,幫助了很多,我重構了代碼以使其工作。現在它運作良好。再次感謝 – Iakhator

0

你的代碼實際上應該一切正常,問題是,基本情況採取項目變量考慮在內,而遞歸函數遞減數據參數,而不是遞減的時間參數