如何用递归求列表中排除3或7倍数的整数和?附代码修正
问题分析与代码修正
原代码存在的问题
- 提前终止递归:当遇到第一个能被3或7整除的元素时,直接返回当前sum,导致后续元素完全没有处理。比如测试列表中的3会触发这个逻辑,直接返回0,后面的5、7、9都没参与计算。
- 修改原列表:使用
numList.pop()会原地修改传入的列表,函数执行后原列表会被清空,产生不必要的副作用。 - 缺少终止返回:当列表为空时,函数没有明确的返回值,会默认返回
None,这在递归的最后一步会导致错误。
修正后的代码
def SumSkip37(numList, sum_val=0): # 终止条件:列表为空时返回累计的和 if not numList: return sum_val # 取第一个元素(不修改原列表),剩下的列表用切片传递 current = numList[0] remaining = numList[1:] if current % 3 == 0 or current % 7 == 0: # 跳过当前元素,继续递归处理剩余列表 return SumSkip37(remaining, sum_val) else: # 累加当前元素,继续递归 return SumSkip37(remaining, sum_val + current) numList = [1, 3, 5, 7, 9] print(f'The result is {SumSkip37(numList)}.') # 原列表不会被修改,验证:print(numList) 输出 [1,3,5,7,9]
代码说明
- 用
numList[0]取第一个元素,numList[1:]获取剩余元素,避免修改原列表。 - 遇到需要跳过的元素时,直接递归处理剩余列表,不终止整个流程。
- 明确终止条件:当列表为空时返回累计的和,确保递归有正确的返回值。
- 把参数
sum改成sum_val,避免和内置函数sum()重名,提升代码可读性。
测试上述代码,输出结果为The result is 6.(1+5=6,3、7、9被跳过),符合预期。
内容的提问来源于stack exchange,提问作者Richard Coterie
相关产品推荐
相关产品推荐

