从递归函数中产生

时间:2016-09-29 04:28:35

标签: python recursion

那么让我们说我有几个节点。每个节点都有一个可以访问的节点列表。该节点列表可以包括其自身。我需要做的是构建一个节点可以采用n长度的所有可能路径。

例如:让我们假设一些事情。

  • 我有节点A和节点B
  • 我需要所有可能的三条长路径(不短路径)
  • 节点A可以自行转到节点B
  • 节点B可以转到自身和节点A

假设我可以构建的所有路径都是:

  1. AAA
  2. AAB
  3. ABA
  4. ABB
  5. BAA
  6. BAB
  7. BBA
  8. BBB
  9. 这是我现在的代码;它工作,但在我的实际情况下,我需要八个长的路径与相当多的节点。这显然会导致一些性能问题。我遇到了在32位版本的Python2.7上运行的MemoryError。我还没有尝试64位版本。目前明显的问题是我目前的实施。我想也许使用产量/发电机会有所帮助。是吗?如果是这样,我怎么能在我的情况下使用收益率来实现?

    此外,如果Python 3具有一些可以实现我所要求的功能,我不仅限于Python 2。 Python 2恰好就是我性能最佳的计算机上的内容。

    PARTS = 3
    
    def dive(node, depth=0):
        combos = []
    
        if depth >= PARTS - 1:
            if node.key:
                return ((node.key,),)
            return ()
    
        for next_ in node.next_nodes:
            for combo in dive(next_, depth=depth+1):
                if not node.key:
                    continue
                combos.append((node.key,) + combo)
        return combos
    

1 个答案:

答案 0 :(得分:0)

你可以通过将返回调用更改为yield来将当前解决方案转换为生成器最简单的方法......这可能已经足够......它可能也不会......还有一些图形遍历库可以解决如果你的目标只是解决问题,那就非常好了

PARTS = 3

def dive(node, depth=0):
    combos = []

    if depth >= PARTS - 1:
        if node.key:
            #return ((node.key,),)
            yield ((node.key,),)
        #return ()
        yield ()
    for next_ in node.next_nodes:
        for combo in dive(next_, depth=depth+1):
            if not node.key:
                continue
            combos.append((node.key,) + combo)
    #return combos
    yield combos

for result in dive(node):
    print result