簡體   English   中英

Python 附加列表中的遞歸

[英]Python recursion in appending lists

我想遞歸地將 append 添加到列表中,但我想不出一個有效的 function。 function 需要兩個 arguments timesdata times應該是數據到append的次數。

到目前為止,這是我的代碼:

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

您可以在每個遞歸調用中使用中間列表來追加。 這樣可以避免您當前遇到的這些重新定義問題:

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]

為了使代碼正常工作,您需要使用下一個遞歸調用的輸出來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

您可以為此使用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

因為您每次都重新定義result2。 將result2保留在函數之外,它應該可以工作。

你也可以考慮做數據*時間來復制,如果數據是一個列表或只是做

(result2.append(data))*times

在遞歸中,每次調用copy_recur時,都會在新名稱空間中創建一個新的result2。

[data] * times

會做您想要達到的目標。

Python 使用“傳遞對象引用”,這就是為什么以下代碼中的任何一個都可以解決您的問題。

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

調用時:

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

或者,您可以創建 result2 列表並將其作為參數傳遞給 function。該參數是“由 Object 引用傳遞”,因此在 function 內部也修改了相同的結果 object。

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

調用時:

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

請參閱以下鏈接以了解更多有關通過 Object 參考的信息。 Python:經過Object參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM