我正在学习递归函数。我完成了一项练习,但以一种与提议不同的方式。
“编写一个递归函数,它接受一个list参数并返回其整数之和。”
L = [0, 1, 2, 3, 4] # The sum of elements will be 10
我的解决办法是:
def list_sum(aList):
count = len(aList)
if count == 0:
return 0
count -= 1
return aList[0] + list_sum(aList[1:])
拟议的解决办法是:
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秒。这意味着我得理解提议的解决方案。
发布于 2016-08-25 11:49:26
在调用函数时,aList
将没有任何元素。换句话说,它拥有的唯一元素是null
。列表就像一个字符串或数组。当您创建一个变量时,您会在内存中为它保留一些空间。List等在最后一个位置上有一个null
,它标志着结束,所以在这一点之后什么都不能存储。您一直在删除列表中的第一个元素,所以只剩下null。当你到达它的时候,你就知道你已经完成了。
如果不使用该条件,该函数将尝试接受一个不存在的数字,因此它会抛出该错误。
发布于 2016-08-25 11:48:01
not aList
如果aList中没有元素,则返回True。解决方案中的if语句覆盖边缘大小写,并检查输入参数是否为空列表。
发布于 2016-08-25 11:55:40
Python将多个值视为假值:
在您的示例中,列表被计算为布尔值。如果它是空的,它被认为是假的,否则它被认为是真。这只是编写if len(aList) == 0:
的一种更短的方法
此外,关于您在评论中的新问题,请考虑您的功能的最后一行:
return aList[0] + proposed_sum(aList[1:])
这一行调用函数的新“实例”,但使用原始列表的子集(原始列表减去第一个元素)。在每个递归中,在参数中传递的列表会松开一个元素,在一定数量的递归之后,传递的列表是空的。
https://stackoverflow.com/questions/39144343
复制相似问题