繁体   English   中英

列表如何在 python 递归中工作,为什么递归中的 int + list 不会失败?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM