2017-02-22 112 views
1

我想遞歸地追加到列表中,但是我不能想出一個可以工作的函數。該函數有兩個參數timesdatatimes應該是追加數據的次數。追加列表中的Python遞歸

這是到目前爲止我的代碼:

def replicate_recur(times, data): 
    result2 = [] 
    if times == 0: 
     result2.append(data) 
    else: 
     result2.append(data) 
     replicate_recur(times - 1, data) 
    return result2 
+0

RESULT2是地方,你在這兒就不得不提到result2.extend(replicate_recur(倍 - 1,數據)) – Kajal

+0

你可以簡單地通過使用result.extend(data * times)來實現這個 – Kajal

+0

我得到了使用遞歸的指令 – Nix

回答

1

您可以使用xrange這一點,沒有一點使用遞歸除非它是一個編碼測試。

def replicate(times, data): 
    result2 = [] 
    for i in xrange(times): 
     result2.append(data) 
    return result2 

同樣的功能可以寫在一個遞歸的方式是這樣的:

def replicate_recur(times, data, listTest=None): 
    # If a list has not been passed as argument create an empty one 
    if(listTest == None): 
     listTest = [] 
    # Return the list if we need to replicate 0 more times 
    if times == 0: 
     return listTest 
    # If we reach here at least we have to replicate once 
    listTest.append(data) 
    # Recursive call to replicate more times, if needed and return the result 
    replicate_recur(times-1, data, listTest) 
    return listTest 
+0

我得到一個工作是試圖如果我可以做同樣的遞歸。 Theres在 – Nix

+0

以下的完美答案我更新了我的答案,看看它並接受它,如果你認爲這是你需要的 –

+0

謝謝,我以爲你把它標記爲答案 –

0

因爲你重新定義RESULT2每次。保持result2不在函數中,它應該工作。

你也可以考慮做數據*倍複製,如果數據是一個列表或者乾脆

(result2.append(data))*times 
+0

這將如何工作?也許迭代將有助於 – Nix

+0

因爲列表會重演。例如[1,2] * 2 = [1,2,1,2] –

2

爲了使您的代碼的工作,需要下一個遞歸調用的輸出extend在當前執行的列表。此外,遞歸的最低深度應times = 1定義:

def replicate_recur(times, data): 
    result2 = [] 
    if times == 1: 
     result2.append(data) 
    else: 
     result2.append(data) 
     result2.extend(replicate_recur(times - 1, data)) 
    return result2 

在另一方面,你可以簡單地複製您的列表:

def replicate(times, data): 
    return [data]*times 
+0

不錯的一個完美。所以我的代碼的問題是,每次函數重新發生我的列表是空的? – Nix

+0

並非如此,您正在調用'replicate_recur',但沒有對返回的結果進行任何操作。如果這是一個真正的用例,而不是學習遞歸函數的工作方式,請使用其他提供的方法。 – Adirio

0

在遞歸,每次replicate_recur被調用時,在新名稱空間中創建一個新的結果2。

[data] * times 

會做你正在努力實現的。

+0

這將乘我的數據,而不是重複它 – Nix

+0

你看到方括號周圍的數據?我在乘以包含您的數據的列表,這相當於重複。 –

2

您可以使用中間列表追加到每個遞歸調用中。這避免了這些問題,重新定義你遇到目前:

def replicate_recur(times, data, result=None): 
    if result is None: # create a new result if no intermediate was given 
     result = [] 
    if times == 1: 
     result.append(data) 
    else: 
     result.append(data) 
     replicate_recur(times - 1, data, result) # also pass in the "result" 
    return result 

當叫:

>>> replicate_recur(4, 2) 
[2, 2, 2, 2]