我最近一直在玩 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/