将带有全局变量的递归转换为使用堆栈的迭代
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
【讨论】:
以上是关于将带有全局变量的递归转换为使用堆栈的迭代的主要内容,如果未能解决你的问题,请参考以下文章