[英]How do lists work in python recursion and why does int + list in recursion not fail?
我刚刚开始学习递归,在阅读了一些文章后,我想知道为什么递归看起来会忽略操作数错误。 例如,我知道您不能将整数添加到列表中,并且我知道以下内容无法执行:
>>> 1 + [2,3]
这将并且应该产生不受支持的操作数类型错误。
但是,当传递以下代码 [1,2,3] 时,它会执行而不会失败:
def list_sum_recursive(input_list):
# Base case
if input_list == []:
return 0
# Recursive case
else:
head = input_list[0]
smaller_list = input_list[1:]
return head + list_sum_recursive(smaller_list)
输出是 6,这对于列表中元素的总和是正确的,但是当我尝试绘制堆栈时,我看到的只是 int + list 的堆栈,我知道应该抛出错误。 关于列表如何在递归中工作,我没有得到什么? 任何人都可以向我解释为什么执行此代码而不会引发错误?
您感到困惑的行必须是return head + list_sum_recursive(smaller_list)
。 你是对的,如果 head 是一个int
并且递归调用返回的另一个对象是一个列表,这将是有问题的 - 但是,问问自己,你的函数在什么时候返回一个列表? 您的函数可以返回 0(基本情况),也可以返回 head + some int。
list_sum_recursive
不返回列表; 它返回其参数中的值的总和:
list_sum_recursive([]) == 0
list_sum_rescursive([1]) == 1 + list_sum_recursive([])
== 1 + 0
== 1
list_sum_rescursive([1, 2]) == 1 + list_sum_recursive([2])
== 1 + (2 + list_sum_recursive([]))
== 1 + (2 + 0)
== 1 + 2
== 3
如果您要为此函数提供类型提示,它可能看起来像
def list_sum_recursive(input_list: List[int]) -> int
不仅可以传递任何列表,因为假设input_list[0]
将是您可以添加到(最终)0 的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.