📜  门| GATE-CS-2014-(Set-3)|问题29(1)

📅  最后修改于: 2023-12-03 15:28:44.119000             🧑  作者: Mango

问题29

本问题涉及程序的正确性。

以下是一个计算列表中所有元素之和的Python程序实现。考虑在列表为空的情况下程序的行为。

def sum(L):
    if not L:
        return 0
    else:
        return L[0] + sum(L[1:])

print(sum([1,2,3,4,5]))

输出结果为:15

该程序递归地调用自己,每次传入的参数是列表L去掉第一个元素后的子列表。最终的返回值是列表中所有元素之和。程序的基础情况是在列表为空时返回0。

但是如果程序的参数是一个空列表,则会出现错误。这是因为在程序的第二行中,通过not L判断列表是否为空,当L为空列表时,not L即为True,程序返回0,这个结果是正确的。但是,在程序的第五行中,当递归调用sum()函数时,传入的参数是空列表[],此时程序会出现IndexError异常,因为空列表[]没有第一个元素,因此无法进行索引访问L[0]操作,导致程序崩溃。

防治此类错误的方法是在程序第二行的判断条件中,将not L改成L is None或者L == None

因此,修正后的程序如下代码所示:

def sum(L):
    if L is None or len(L) == 0:
        return 0
    else:
        return L[0] + sum(L[1:])

print(sum([1,2,3,4,5]))
print(sum([]))

上述代码的输出结果为:

15
0

可以看出,在列表为空时,程序返回0,不会出现异常。