遍历嵌套列表,并为每个元素分配一个相互依赖的值w/o递归(Python)
Traverse nested list and assign an interdependent value to each element w/o recursion (Python)
我想解散以下函数的递归,因为某些输入数据导致递归深度过大错误。
Increasing the recursion depth 不是 long-运行 中的解决方案。
def foo(x):
for element in x.elements:
element.depth = x.depth + 1
self.foo(element)
List flattening不适用,需要保留原有列表结构
This solution 使用生成器,但包含递归。它是发电机这一事实有什么不同吗?
最后是。在这里,我不确定这是否 100% 适用,因为要分配的值是相互依赖的。
什么是优雅的(Pythonic)非递归解决方案?
您基本上是在对数据实施 DFS。您的数据是图形,其中每个元素都是一个节点,两个元素之间的连接是一条边。
您可以轻松地用堆栈 DFS 替换递归 DFS,方法是迭代元素并压入堆栈,并继续这样做直到堆栈耗尽。
请注意,可能存在 small difference in the ordering of elements,但也可以轻松解决。
DFS 的伪代码为:
def foo(x):
s = new stack
s.push(x)
while not s.empty()
e = s.pop()
for element in e.elements: # or elements[::-1] for reversed order
element.depth = e.depth + 1
s.push(element)
# if data structure is not a tree, add visited set.
def foo(x):
stack = [(x,0)]
while stack:
node,depth = stack.pop(0)
node.depth = depth
stack.extend([(ele,depth+1) for ele in node.elements if ele])
根据你的描述我觉得至少...
我想解散以下函数的递归,因为某些输入数据导致递归深度过大错误。 Increasing the recursion depth 不是 long-运行 中的解决方案。
def foo(x):
for element in x.elements:
element.depth = x.depth + 1
self.foo(element)
List flattening不适用,需要保留原有列表结构
This solution 使用生成器,但包含递归。它是发电机这一事实有什么不同吗?
最后是
什么是优雅的(Pythonic)非递归解决方案?
您基本上是在对数据实施 DFS。您的数据是图形,其中每个元素都是一个节点,两个元素之间的连接是一条边。
您可以轻松地用堆栈 DFS 替换递归 DFS,方法是迭代元素并压入堆栈,并继续这样做直到堆栈耗尽。
请注意,可能存在 small difference in the ordering of elements,但也可以轻松解决。
DFS 的伪代码为:
def foo(x):
s = new stack
s.push(x)
while not s.empty()
e = s.pop()
for element in e.elements: # or elements[::-1] for reversed order
element.depth = e.depth + 1
s.push(element)
# if data structure is not a tree, add visited set.
def foo(x):
stack = [(x,0)]
while stack:
node,depth = stack.pop(0)
node.depth = depth
stack.extend([(ele,depth+1) for ele in node.elements if ele])
根据你的描述我觉得至少...