如果有人能告诉我为什么sum\u all([1,[2,[3,[4]]])不起作用,我将不胜感激?它说它只能将list(而不是“int”)连接到list,但是如果我的代码按我认为应该的方式工作,那就不应该发生。顺便说一句,我的代码使用递归对列表中的所有元素求和,而不管它们是整数还是其他列表
def rec_sum(numbers):
lnum = len(numbers)
if lnum == 0:
return 0
elif lnum == 1:
return numbers[0]
else:
numbers[0] = numbers[-1] + numbers[0]
del numbers[-1]
return rec_sum(numbers)
def sum_all(numbers):
lnum = len(numbers)
if lnum == 0:
return 0
elif lnum == 1:
if isinstance(numbers[0], int):
return numbers[0]
elif isinstance(numbers[0], list):
return rec_sum(numbers[0])
else:
if isinstance(numbers[-1], list) and isinstance(numbers[0], list):
numbers[0] = rec_sum(numbers[0]) + rec_sum(numbers[-1])
del numbers[-1]
return sum_all(numbers)
elif isinstance(numbers[-1], list) and isinstance(numbers[0], int):
numbers[0] = numbers[0] + rec_sum(numbers[-1])
del numbers[-1]
return sum_all(numbers)
elif isinstance(numbers[-1], int) and isinstance(numbers[0], list):
numbers[0] = rec_sum(numbers[0]) + numbers[-1]
del numbers[-1]
return sum_all(numbers)
elif isinstance(numbers[-1], int) and isinstance(numbers[0], int):
numbers[0] = numbers[0] + numbers[-1]
del numbers[-1]
return sum_all(numbers)
回溯(最近一次呼叫):
File "<pyshell#8>", line 1, in <module> sum_all([1, [2, [3, [4]]]])
File "C:/Users/#/Documents/python/recursion.py", line 36, in sum_all numbers[0] = numbers[0] + rec_sum(numbers[-1])
File "C:/Users/#/Documents/python/recursion.py", line 17, in rec_sum numbers[0] = numbers[-1] + numbers[0]
TypeError: can only concatenate list (not "int") to list
非常简单地考虑一下当嵌套输入出现在代码中时会发生什么。在代码中:
我们可以说这一标准确实得到了满足。然后你就有了:
我们知道
numbers[-1]
是一个列表,但我们不知道它是否是一个平面列表。在rec_sum(numbers[-1])
中有一行:因为数字是嵌套的,所以数字中的一个元素可以是列表,而另一个元素可以是整数。尝试添加它们会抛出一个错误
你试图处理这个问题是错误的。这样想:
下面是一个应用上述逻辑的简洁的一行代码:
你根本不需要
rec_sum
。递归的思想是,每个子列表都以与当前列表相同的方式处理,并且rec\u sum没有与主函数sum_all
相同的逻辑来区分列表和数字,因为它将每个项目都视为一个数字,所以当它尝试添加项目但其中一个是列表时,由于无法“添加”(或将列表与数字串联)而引发异常相反,只需删除
rec_sum
,并用sum_all
替换所有对rec_sum
的调用,代码就很好了print(sum_all([[4,5],1,4,5,[3,[1],5]]))
的输出:(用于引发异常)相关问题 更多 >
编程相关推荐