2016-09-18 100 views
2

我試圖編寫一個Python函數來接收一個字符串和一個數字並返回一個包含字符串重複的列表。例如Python遞歸變量狀態

print func(3, 'aaa') 

回報

['aaa', 'aaa', 'aaa'] 

這是我迄今所做的:

def func(times, data): 
    if times > 0: 
     return data.split() + func(times-1, data) 

但是,它給了我一個類型錯誤:

can only concatenate list (not "NoneType") to list. 

我我仍然是一個新手,我剛剛讀了關於recu rsion。

我也想知道如何從連續的函數調用中「繼承」變量的狀態,而不必定義全局變量。請幫助!

+3

那麼,什麼時候'次發生== 0'?在這種情況下你沒有返回任何東西。 –

+1

雖然這可以通過遞歸來完成,但是這個問題似乎很簡單,沒有它 –

+2

'['aaa'] * 3' –

回答

5

你需要一個基礎情況下的時間爲0時,你可以返回一個空列表:

def func(times, data): 
    if times == 0: 
     return [] 
    # no need for split, just wrap data in a list. 
    return [data] + func(times-1, data) 

在你的代碼時,次== 0,你的函數返回隱無,所以你嘗試添加遞歸調用None的結果。我們還應該使用< =在基本情況下趕上負輸入時間:

def func(times, data): 
    if times <= 0: 
     return [] 
    return [data] + func(times-1, data) 

如果我們沒有,我們將無限遞歸併觸及RuntimeError: maximum recursion depth exceeded,因爲我們永遠不會打到基本情況。

有一個不錯的在線工具python tutor,可以可視化的步驟,所以你可以看到究竟發生了什麼,這將突出顯示爲什麼和你的代碼erros的地方。

當你有,你可以使用rcviz工作解決方案,這將創造的執行步驟,一個漂亮的PNG:

enter image description here

注:1,邊緣通過在他們的順序編號遍歷執行。 2.邊緣從黑色變爲灰色,表示遍歷順序:先黑邊,後邊灰邊

0

雖然@Padraic坎寧安有一個很好的答案,這裏是一個簡單的方法來做到這一點:

def func(number, content): 
    return [content] * number 

或列表理解:

def func(number, content): 
    return [content for _ in range(number)]