2017-11-10 109 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,因为它是乘法的身份。

相关问题