【问题标题】:Traverse nested list and assign an interdependent value to each element w/o recursion (Python)遍历嵌套列表并为每个元素分配一个相互依赖的值,无需递归(Python)
【发布时间】:2017-08-16 16:08:45
【问题描述】:

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

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

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

This solution 使用生成器,但包含递归。它是一个生成器这一事实有什么不同吗?

最后是stack approach。在这里,我不确定这是否 100% 适用,因为要分配的值相互依赖。

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

【问题讨论】:

    标签: python algorithm list nested non-recursive


    【解决方案1】:

    您基本上是在您的数据上实现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.
    

    【讨论】:

      【解决方案2】:
      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])
      

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

      【讨论】:

        猜你喜欢
        • 2021-09-19
        • 2019-02-15
        • 2017-05-27
        • 2021-10-30
        • 2021-12-15
        • 1970-01-01
        • 2019-09-06
        • 2019-03-27
        • 1970-01-01
        相关资源
        最近更新 更多