我試圖理解爲什麼遞歸函數返回的1003,而不是1005爲什麼遞歸函數返回這個值?
l = [1,2,3]
def sum(l):
x, *y = l
return x + sum(y) if y else 1000
sum(l)
根據pythontutory
列表的最後一個值是5,這將使返回值1000 + sum([2,3])
1005,我是不是正確的?
我試圖理解爲什麼遞歸函數返回的1003,而不是1005爲什麼遞歸函數返回這個值?
l = [1,2,3]
def sum(l):
x, *y = l
return x + sum(y) if y else 1000
sum(l)
根據pythontutory
列表的最後一個值是5,這將使返回值1000 + sum([2,3])
1005,我是不是正確的?
根據pythontutor y列表的最後一個值是5,這將返回值
1000 + sum([2,3])
1005,我正確嗎?
不,y
最後一個值是[]
。這絕不是一個清單,除此之外,它永遠不會有任何的5
。最重要的是,遞歸返回值總是在+
的右邊,只有x
在左邊。
讓我們一步步通過它:
sum([1, 2, 3]) = 1 + sum([2, 3])
sum([2, 3]) = 2 + sum([3])
sum([3]) = 1000
所以,代回:
sum([2, 3]) = 2 + 1000 = 1002
sum([1, 2, 3] = 1 + 1002 = 1003
的問題是,當y
是空的,你回來1000
,不x + 1000
。
您的困惑可能只是一個優先事項。也許你預計:
return x + sum(y) if y else 1000
...的意思是:
return x + (sum(y) if y else 1000)
...但實際上,它的意思是:
return (x + sum(y)) if y else 1000
遞歸步步
1)x = 1
y = [2,3]
2)x = 2
y = [3]
3)x = 3
y = []
注意,步驟3)返回自從not y
起。這是因爲你的回報語句相當於
(x + sum(y)) if y else 1000
因此,我們有
3)1000
2)1000 + 2
1)1002 + 1
結果是1003
。
因此,也許你正在尋找的是:
return x + sum(y) if y else 1000 + x
或(從ndpu的答案複製):
return x + (sum(y) if y else 1000)
(以x
考慮在最後一步)爲
我不明白的是'x'最終如何變成'3'。因爲在每次迭代中我們都將'x'重新分配給下一個'l'值。 'x'被提升到'3'。函數如何記住'x'的值? – minerals
,爲什麼我們在步驟2)和1)有相應的1000 + 2和1002 + 1?我認爲我們應該只有2和1,因爲'else'條件在該階段沒有被觸發。 – minerals
@minerals這是一個遞歸。步驟2中的值是來自步驟3的值(即1000)+ x是2.步驟1中的值是來自步驟2的值,即1002 + x是1.對於第一個問題:在第三步中,調用'sum([3])'so'x,* y = [3]'產生'x = 3'和'y = []'。我不確定你的意思是「提升到3」。 – freakish
你應該嘗試使用調試器或實際打印的東西在函數內部。如果沒有執行的代碼,我想這應該是這樣的:
l = [1,2,3]
def sum(l):
x, *y = l
return x + sum(y) if y else 1000
sum(l)
它會調用一個這樣的:
-> sum([1,2,3])
x : 1
y : [2, 3]
-> sum([2, 3])
x: 2
y: [3]
-> sum([3])
x: 3
y: []
returns 1000
returns 2 + 1000
returns 1 + 1002
他已經嘗試使用交互式分步可視化工具,並且無法理解它向他展示的內容;我不確定一個'pdb'樣式的調試器,它具有相同的信息,不太適合新手使用,可以幫助... – abarnert
您應該加上括號:
l = [1,2,3]
def sum(l):
x, *y = l
return x + (sum(y) if y else 1000)
這是什麼語法: 'x,* y = l'?它是python 3嗎? – Elisha
@Elisha它會解開l到y的其餘部分。 –
我猜想,但它不適用於python2.7。我認爲最好添加'python3'標籤 – Elisha