小编典典

如何将递归函数转换为使用堆栈?

algorithm

假设我有一棵要使用“深度优先搜索”遍历的树,并且遍历它的算法如下所示:

algorithm search(NODE):
  doSomethingWith(NODE)
  for each node CHILD connected to NODE:
    search(CHILD)

现在,在许多语言中,递归的最大深度是最大的,例如,如果递归的深度超过某个限制,则该过程将因堆栈溢出而崩溃。

如何在没有递归的情况下而是通过堆栈来实现此功能?在许多情况下,有 很多局部变量 。它们可以存储在哪里?


阅读 255

收藏
2020-07-28

共1个答案

小编典典

您将其更改为使用如下所示的堆栈:

algorithm search(NODE):
  createStack()
  addNodeToStack(NODE)

  while(stackHasElements)
      NODE = popNodeFromStack()
      doSomethingWith(NODE)
      for each node CHILD connected to NODE:
         addNodeToStack(CHILD)

至于第二个问题:

在许多情况下,有很多局部变量;它们可以存储在哪里?

这些实际上可以保留在与原始位置相同的位置。如果变量是“
doSomethingWith”方法的局部变量,只需将其移至该变量中,然后将其重构为单独的方法即可。该方法不需要处理遍历,只需要处理即可,并且可以使自己的局部变量以这种方式仅在其范围内起作用。

2020-07-28