<分区>
Possible Duplicate:
Are there problems that cannot be written using tail recursion?
根据我的理解,尾递归是一种优化,当递归调用不需要来自递归调用的垃圾邮件信息时,您可以使用它。
是否可以使用尾递归实现所有递归函数?像 DFS 这样的东西怎么样,你需要最里面的 child 在 parent 可以之前返回?
<分区>
Possible Duplicate:
Are there problems that cannot be written using tail recursion?
根据我的理解,尾递归是一种优化,当递归调用不需要来自递归调用的垃圾邮件信息时,您可以使用它。
是否可以使用尾递归实现所有递归函数?像 DFS 这样的东西怎么样,你需要最里面的 child 在 parent 可以之前返回?
最佳答案
这完全取决于您的要求。
如果您想将所有函数都保留为具有相同签名的函数(无可变状态),那就不行。最明显的例子是快速排序,其中两个调用都不能是尾调用。
如果您可以通过各种方式修改函数,那么可以。有时局部修改就足够了 - 通常你可以添加一个“累加器”来构建一些返回的表达式,但是,如果结果涉及非交换操作,那么你需要小心(例如,当天真地构造链表时,顺序相反)或者您可以添加堆栈。
或者,您可以对整个程序进行全局修改,其中每个函数都将包含 future 操作的函数作为一个额外的参数。这是 Pete is talking about 的延续.
如果您是手工操作,那么本地修改通常相当容易。但如果您正在执行自动重写(例如在编译器中),那么采用全局方法会更简单(它需要更少的“智慧”)。
关于algorithm - 是否可以将所有递归函数重写为尾递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11715224/