algorithm - 是否可以将所有递归函数重写为尾递归?

标签 algorithm recursion tail-recursion

<分区>

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/

相关文章:

algorithm - 从数组 O(n) 中删除所有零,没有额外的内存

java - java中用于非轴对齐框的简单快速碰撞算法

scala - 为什么 Haskell 不需要蹦床?

python - 在论文中跟踪递归函数

clojure - loop-recur 怎么可能抛出 StackOverflowError?

algorithm - clojure中的列表处理,需要尾递归

java - 二进制搜索运行时的某些异常

algorithm - 二分查找和二分查找树的区别?

c++ - 递归地将整数存储在数组中

ocaml - OCaml 中的尾调用转换