首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在这个简短的递归函数`list_sum(aList)`中,finish条件是‘`if aList:返回0’。我看不出为什么这种情况会起作用。

在这个简短的递归函数`list_sum(aList)`中,finish条件是‘`if aList:返回0’。我看不出为什么这种情况会起作用。
EN

Stack Overflow用户
提问于 2016-08-25 11:41:54
回答 5查看 471关注 0票数 0

我正在学习递归函数。我完成了一项练习,但以一种与提议不同的方式。

“编写一个递归函数,它接受一个list参数并返回其整数之和。”

代码语言:javascript
运行
复制
L = [0, 1, 2, 3, 4]  # The sum of elements will be 10

我的解决办法是:

代码语言:javascript
运行
复制
def list_sum(aList):
    count = len(aList)
    if count == 0:
    return 0

    count -= 1
    return aList[0] + list_sum(aList[1:])

拟议的解决办法是:

代码语言:javascript
运行
复制
def proposed_sum(aList):
    if not aList:
        return 0
    return aList[0] + proposed_sum(aList[1:])

我的解决方案很清楚它是如何工作的。

建议的解决方案更短,但我不清楚为什么这个函数能工作。if not aList是如何发生的?我的意思是,如果not aList意味着检查真/假,那么其余的代码将如何实现not aList,但是这里的真/假是怎样的呢?

我知道return 0会导致递归停止。

另外,在不使用if not aList的情况下执行IndexError: list索引超出了范围。

此外,timeit-100万表示我的功能比较慢。它需要3.32秒,而建议则需要2.26秒。这意味着我得理解提议的解决方案。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-08-25 11:49:26

在调用函数时,aList将没有任何元素。换句话说,它拥有的唯一元素是null。列表就像一个字符串或数组。当您创建一个变量时,您会在内存中为它保留一些空间。List等在最后一个位置上有一个null,它标志着结束,所以在这一点之后什么都不能存储。您一直在删除列表中的第一个元素,所以只剩下null。当你到达它的时候,你就知道你已经完成了。

如果不使用该条件,该函数将尝试接受一个不存在的数字,因此它会抛出该错误。

票数 1
EN

Stack Overflow用户

发布于 2016-08-25 11:48:01

代码语言:javascript
运行
复制
not aList 

如果aList中没有元素,则返回True。解决方案中的if语句覆盖边缘大小写,并检查输入参数是否为空列表。

票数 1
EN

Stack Overflow用户

发布于 2016-08-25 11:55:40

Python将多个值视为假值:

  • 假的(当然)
  • 空集合(字典、列表、元组)
  • 空字符串('',"",‘,“,r'',u"”等等)
  • _方法返回False的任何其他对象

在您的示例中,列表被计算为布尔值。如果它是空的,它被认为是假的,否则它被认为是真。这只是编写if len(aList) == 0:的一种更短的方法

此外,关于您在评论中的新问题,请考虑您的功能的最后一行:

代码语言:javascript
运行
复制
return aList[0] + proposed_sum(aList[1:])

这一行调用函数的新“实例”,但使用原始列表的子集(原始列表减去第一个元素)。在每个递归中,在参数中传递的列表会松开一个元素,在一定数量的递归之后,传递的列表是空的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39144343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档