作爲一個練習,我試圖做一個腳本,它會給我一個列表中的項目的總和,但不使用SUM或FOR/WHILE循環。Python:遞歸併返回
我結束了與解決它:
3210這種運作良好,並返回「10」,但我最初的做法是:
def addition(data, total=0):
if data != []:
total += data.pop()
addition(data, total)
return total
print(addition([1,2,3,1,2,1]))
和代碼返回「1」,第二個位而不是'10'。我無法弄清楚爲什麼這兩種方法沒有做同樣的事情,或者即使第二個例子在數據= []和總數= 10時進入最後一個循環時出現'1',我猜測我錯過了關於變量作用域如何工作的一些規則?
(如下面的答案解釋,它有無關變量的作用域,所以我改變了標題,以反映的問題,任何人在將來對這個事情)
這不是真的與你的問題有關(這在下面得到了很好的回答),但是我想補充一點,Python不會爲尾遞歸提供任何好處,所以你可以簡化你的函數, '如果data:return data.pop()+ addition(data)'用'else:return 0'作爲基本情況。你根本不需要'total'參數,因爲實際的加法是和返回值一起發生的。 – Blckknght
嘿@Blckknght,仍然有點新,我想我正在用錯誤的方式來看遞歸,但看着你的例子,我想我現在明白了。我更像是一個while循環,其中每個迭代都將被線性處理,並且一個循環的輸出將成爲下一個輸入,直到達到基本情況才能打破循環,但在遞歸中情況並非如此,是嗎?這更像是解開其中的同一表達式,直到達到已知的基本情況,然後從最內層的表達式向外解決所有問題。謝謝你,這有助於 –
@Blckknght '高清謊(數據): 如果數據> 1: 回報FIB(數據-1)+ FIB(數據-2) ELIF數據== 1: 回報1 其他: return 0 print(fib(15))' 是的,有了這個想法,我現在完全明白爲什麼返回語句也是必要的 –