2017-11-10 126 views
-3

好吧,所以我是編程新手,我正在參加計算機科學的入門課程。我們正在使用Python 3.6,並且有一個我們的教授告訴我們要做的練習。爲什麼「返回0」在我的代碼中起作用?

基本上我們必須編寫一個函數,使輸入是一個列表,我們必須返回值的總和。如果有一個列表作爲我們初始列表的一個元素,我們必須對其中的所有數字進行求和。

我的一個朋友幫我和代碼工作,但我不明白爲什麼它會工作。

下面的代碼:

def f(L): 
    sum = 0 
    if len(L)==0: 
     return 0 
    if isinstance(L[0], int): 
     sum = sum + L[0] 
    elif isinstance(L[0], list): 
     sum = sum + f(L[0]) 

    L.remove(L[0]) 

    return sum + f(L) 

和輸入的一個例子是:

print(f([[99777634], [97179966, 91871251], [99887343, 97636420], [92431849]])) 

有人可以解釋我是如何「迴歸0」的作品,爲什麼它的工作原理?

+3

我不確定,我理解這個問題。該代碼部分通過檢查列表是否爲空(其長度爲0)並返回0來工作。這是正確的,因爲空列表的總和實際上是0. – sepp2k

+0

看起來像遞歸基本情況,因此您可以終止遞歸。也看起來不是一個很好的方法來做你正在做的事情,因爲你可以迭代列表並計算總和而不使用標記。 – birryree

回答

2

該函數使用遞歸。簡單來說,遞歸是在同一個函數內調用一個函數的時候。這樣做是檢查列表的第一個元素的類型,然後如果該元素是一個整數,它將它添加到總和並移動到列表中的下一個元素。如果它是一個列表,然後它再次在該內部列表上調用該函數,並將該列表的總和添加到總和中。我會建議你自己做這個,而不使用你在課堂上學到的更多的遞歸。

2

在遞歸函數中,您總是需要(至少)一個基本情況。也就是說,沒有該功能的輸入將會重複出現。這個分支(當列表L爲空時)用於此目的。 (注意,其他兩種情況會重複發生

3

這是一個遞歸函數。它基於簡單的觀察,即列表中所有元素的總和可以通過將第一個元素添加到列表中其餘元素的總和中找到。

所有遞歸算法都需要一個基本情況 - 一個輸入,其中直接確定結果,而無需再次調用該函數。否則,它將永遠不斷地自稱。在這種情況下,空列表是基本情況,其總和爲0。這樣,當將該結果添加到上一次調用中第一個元素的值時,就會得到第一個元素。

0是「附加標識」,因此它被用作空列表的基值。如果你在乘法而不是加法,你會使用1,因爲它是乘法的身份。

相關問題