从递归函数返回值

时间:2021-03-13 13:41:56

标签: python recursion return

此代码打印图中从 startNode 到 destinationNode 的所有路径。 我从 https://www.geeksforgeeks.org/find-paths-given-source-destination/ 复制了它并稍微修改了它。代码工作得很好,但我需要返回路径而不是打印路径,但不知道如何做到这一点。 如果我将 return 添加到 printAllPathsUtil(i, d, unvisited, path),它只会返回其中一个路径。

我不太擅长递归,现在不知道该做什么。

async def getAllPathsUtil(s, d, unvisited, path): 
    unvisited.append(s)
    path.append(s) 
    if s == d: 
        path
    else: 
        for i in (await children(s)):
            if not(i in unvisited):
                await getAllPathsUtil(i, d, unvisited, path)
    path.pop() 
    unvisited.remove(s)

async def printAllPaths(startNode, destinationNode):
    all_paths = await getAllPathsUtil(startNode, destinationNode, [], [])
    print(all_paths)

1 个答案:

答案 0 :(得分:1)

如果您想保留递归算法,那么使用 yield 可能是最简单的选择。

def graph_paths(s, d, visited, path): 
    visited.append(s)
    path.append(s) 
    if s == d: 
        yield path
    else: 
        for i in children(s):
            if i not in visited:
                yield from graph_paths(i, d, visited, path)

    path.pop() 
    visited.remove(s)

def print_graph_paths(start_node, dest_node):
  for path in graph_paths(start_node, dest_node, [], []):
    print(path)

但作为一种更好的方法,我建议用堆栈替换递归调用,它将消除最大递归深度问题。