functional-programming - OCaml 没有任何递归检查吗?

标签 functional-programming ocaml tail-recursion

我最近一直在玩 OCaml,并立即做了我最喜欢的事情来检查 VM/编译器的开发程度,并编写了一个递归程序:

let rec f i =
    Printf.eprintf "i = %d\n" i;
    f(i+1);;

let () =
    f 0;;

该程序按预期运行,但是,递归 从不 中断,事实上,我让这个程序运行了一段时间(大约 30 分钟),将 stderr 重定向到一个文件,以避免阻塞我的终端。检查文件后,当我发现文件大约有 7*GB* 大时,我惊呆了!

怎么会这样? OCaml 没有任何递归限制吗?

最佳答案

您应该查找有关 tail-call optimization 的信息.

为了回答您的问题,有一个堆栈限制,如果堆栈不断增长,您的程序就会达到该限制。

您不应该期望用您的程序达到它,就像您期望在 C 程序中的无用表达式中被零除总是在编译后总是产生被零除:编译器可能会删除无用的除法。在您的示例中,编译器删除了无用的堆栈溢出。

实际上,它比这更进一步。正如维基百科页面所解释的,OCaml 和大多数函数式语言都保证完成尾调用转换,因此您在使用递归时可以依赖它。

关于functional-programming - OCaml 没有任何递归检查吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4896297/

相关文章:

haskell - 柯里化(Currying)会产生部分应用的函数吗?

functional-programming - 与 JavaScript 相比,TypeScript 提供了哪些额外的函数式编程功能?

c++ - 如何安全地在 C++/Ocaml 之间转换树数据结构?

clojure - 为什么这个 Clojure 素数生成器会引发 StackOverflowError?

java - 强行退出递归的抛出异常是否有效?

javascript - 在 try block 中分配值的最佳方法

python - functools.partial 和 functools.reduce 之间的交互

printing - Ocaml:再次调用递归函数

pattern-matching - OCaml 模式匹配变体中的 "Pattern expected"

haskell - 我很困惑什么是递归,尾递归,原始递归,什么不是