将带有全局变量的递归转换为使用堆栈的迭代

Posted

技术标签:

【中文标题】将带有全局变量的递归转换为使用堆栈的迭代【英文标题】:Translating recursion with globals to iteration using stack 【发布时间】:2012-02-23 19:20:26 【问题描述】:

如何将使用全局变量的递归函数转换为迭代函数?

其中一个例子是使用深度优先搜索来跟踪路径:

path = []

function dfs(node)
    node.visited = true
    path.append(node)

    if node == goal
        print path
        stop;

    for child in node.children
        if !child.visited
            dfs(child)

    path.pop()

我将如何使用迭代和堆栈来做到这一点?

【问题讨论】:

此链接中有一个 C# 示例可以帮助您:msdn.microsoft.com/en-us/library/bb513869.aspx 你知道不使用全局变量的函数怎么做吗? 那么你知道的方法到底是哪里出了问题? @n.m:当您尝试回溯状态时,它会崩溃。我可以将path 设为非全局变量,但这会产生非常大的开销。 我看不出它是如何导致大量开销的?例如 rio 的答案没有使用太多的内存或其他开销。 【参考方案1】:

如果您可以扩展 Node 类,它将如下所示。

function iterative_dfs(start_node)
    start_node.next = null
    start_node.visited = true

    stack = []
    stack.push(start_node)

    while !stack.empty?
        node = stack.pop

        if node == goal
            path = []
            while node
                path.push(node)
                node = node.next
            path.reverse
            print path
            stop;

        for child in node.children
            if !child.visited
                child.next = node
                child.visited = true
                stack.push(child)

另外,您的代码有错误。如果找不到目标,则应弹出该节点。

function dfs(node)
    node.visited = true
    path.append(node)

    if node == goal
        print path
        stop;

    for child in node.children
        if !child.visited
            dfs(child)

    path.pop    # You need this

【讨论】:

以上是关于将带有全局变量的递归转换为使用堆栈的迭代的主要内容,如果未能解决你的问题,请参考以下文章

不同风格的递归,引用/全局/指针变量的使用

全局变量 局部变量 递归

寄存器中的全局变量

使用线程局部存储将具有全局变量的单线程遗留代码转换为多线程代码

python基础 函数局部变量 全局变量 递归

全局变量与静态变量