这些示例来自Mark Lutz的Learning Python。第一个函数是递归函数,用于遍历具有任意嵌套的列表以计算元素之和:
def sumtree_rec(L):
tot = 0
for x in L:
if not isinstance(x, list):
tot += x
else:
tot += sumtree(x)
return tot
第二个功能实现相同的功能,但没有递归:
def sumtree_notrec(L):
tot = 0
items = list(L)
while items:
front = items.pop(0)
if not isinstance(front, list):
tot += front
else:
items.extend(front)
return tot
我相信我了解这两个功能是如何工作的。我跟踪了代码主体中每次迭代时L在sumtree_notrec中的变化,并与本书的输出匹配。我还认为我理解为什么将递归视为堆栈,因为每个级别都将一个调用框架推送到运行时堆栈,并在调用完成时将其弹出。
我不明白的是为什么将递归函数称为FIFO队列?我查了一下,感觉就像我了解数据结构代表什么,只是看不到它们如何应用于此功能。我还找到了该资源,它对调用堆栈做了一些解释:https://www.cs.ucsb.edu/~pconrad/cs8/topics.beta/theStack/02/
例如,如果我在非递归函数(不是实际的代码,只是一个表示形式)中通过L进行跟踪:
L --> [1,[2,[3,4],5],6,[7,8]]
L --> (1) is popped [[2,[3,4],5],6,[7,8]]
L --> [2,[3,4],5] is not popped
L --> [6,[7,8],2,[3,4],5]
等...
为什么将其称为队列?什么对象是“先入先出”然后是“先出先出”?
答案 0 :(得分:1)
递归版本是深度优先搜索。非递归版本是广度优先搜索。在非递归版本中,items
列表被视为队列。每当从items
弹出列表时,该列表中的各个元素都会添加到items
的末尾。
这是队列的简单定义:将元素添加到后面并从前面删除。