【发布时间】:2015-03-03 11:00:59
【问题描述】:
使用堆栈实现递归似乎很明显。但是,一般递归究竟是如何使用堆栈实现的呢?例如,如果我们有一个递归的自定义函数,我们可以只使用堆栈和迭代来重写代码吗?
这是一个例子(我在另一篇文章中给出了错误的例子):
def recursiveCall(node):
if node==None:
return (0,True)
(left,lstatus) = recursiveCall(node.left)
(right,rstatus) = recursiveCall(node.right)
if lstatus==True and rstatus==True:
if abs(left-right)<=1:
return (max(left,right)+1,True)
else:
return (0,False)
else:
return (0,False)
或更简单的:
def recursiveInorder(node):
if node==None:
return
recursiveInorder(node.left)
print(node.val)
recursiveInorder(node.right)
您如何使用堆栈实现这种递归?请注意,我并不是要求对上述两个示例进行迭代解决方案。我相信一定有。但我想那些迭代解决方案并不是试图使用堆栈来重现递归机制。我希望看到,如果可能的话,这些递归可以完全被自定义编码的堆栈机制所取代(基本上是使隐式递归机制嵌入编译器或任何显式的机制)。
我认为需要找到一种方法来跟踪和恢复程序状态、局部变量等? 谢谢。
节点类定义为:
class node:
def __init__(self,x):
self.val=x
self.left=None
self.right=None
【问题讨论】:
-
Christian Thx.. 但我无法阅读帖子中使用的大部分语言。也许我确实需要看一个真实的例子。
-
对递归函数的调用本质上是压入堆栈。递归调用的返回是从堆栈中弹出。当堆栈不为空时程序继续运行。
-
但我认为您还需要将其他内容推入堆栈。还 。两个分行怎么样?我怎么知道在哪里恢复?在中序示例中,您在中间恢复
-
如果你在 Python 上因为递归太深而导致堆栈溢出,而你的程序相对简单,一个友好的建议:尝试用 C/C++ 或 Java/Scala 重写它。与尝试绕过 Python 中的限制相比,这很可能会花费您更少的时间。