0

我想解散以下函数的递归,因为某些输入数据导致超出递归深度错误。 从长远来看,增加递归深度并不是一个解决方案。

def foo(x):
    for element in x.elements:
        element.depth = x.depth + 1
        self.foo(element)

列表展平不适用,因为需要保留原始列表结构。

此解决方案使用生成器,但包含递归。它是发电机的事实有什么不同吗?

最后,还有堆栈方法。在这里,我不确定这是否 100% 适用,因为要分配的值相互依赖。

什么是优雅的(Pythonic)非递归解决方案?

4

2 回答 2

1

您基本上是在对数据实施DFS。您的数据是图,其中每个元素都是一个节点,两个元素之间的连接是一条边。

您可以通过迭代元素并推送到堆栈轻松地将递归 DFS 替换为堆栈 DFS,并继续这样做直到堆栈耗尽。

请注意,元素的顺序可能存在细微差别,但也可以轻松解决。

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.
于 2017-03-23T21:30:45.897 回答
1
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])

我认为至少...根据您的描述

于 2017-03-23T21:32:32.537 回答