2014-01-21 117 views
0

我試圖理解爲什麼遞歸函數返回的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,我是不是正確的?

enter image description here

+0

這是什麼語法: 'x,* y = l'?它是python 3嗎? – Elisha

+1

@Elisha它會解開l到y的其餘部分。 –

+0

我猜想,但它不適用於python2.7。我認爲最好添加'python3'標籤 – Elisha

回答

3

根據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 
2

遞歸步步

1)x = 1y = [2,3]

2)x = 2y = [3]

3)x = 3y = []

注意,步驟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考慮在最後一步)爲

+0

我不明白的是'x'最終如何變成'3'。因爲在每次迭代中我們都將'x'重新分配給下一個'l'值。 'x'被提升到'3'。函數如何記住'x'的值? – minerals

+0

,爲什麼我們在步驟2)和1)有相應的1000 + 2和1002 + 1?我認爲我們應該只有2和1,因爲'else'條件在該階段沒有被觸發。 – minerals

+1

@minerals這是一個遞歸。步驟2中的值是來自步驟3的值(即1000)+ x是2.步驟1中的值是來自步驟2的值,即1002 + x是1.對於第一個問題:在第三步中,調用'sum([3])'so'x,* y = [3]'產生'x = 3'和'y = []'。我不確定你的意思是「提升到3」。 – freakish

1

你應該嘗試使用調試器或實際打印的東西在函數內部。如果沒有執行的代碼,我想這應該是這樣的:

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 
+0

他已經嘗試使用交互式分步可視化工具,並且無法理解它向他展示的內容;我不確定一個'pdb'樣式的調試器,它具有相同的信息,不太適合新手使用,可以幫助... – abarnert

2

您應該加上括號:

l = [1,2,3] 
def sum(l): 
    x, *y = l 
    return x + (sum(y) if y else 1000)