ocaml是否记忆递归函数

Does ocaml memoize recursive functions

假设我有以下用 ocaml 编写的伪代码。

foo(n:int, d:int) = foo(n-1,d-1) + foo(n-1,d)
//Assume proper terminating conditions are added here

即它正在计算一个递归定义的函数。

以上不是尾递归。天真的实现也会导致完成大量冗余工作(比如 foo(n-1,d) 计算将导致再次调用 foo(n-1,d-1))

我知道我可以手动写这个作为一个动态规划问题。我对这里不感兴趣

我的问题是,如果我这样写,ocaml 是否会做一些巧妙的事情,比如记忆节点,这样它们就不会被重新计算。还是其他一些我梦寐以求的奇特事物?

不,OCaml 不会对这段代码做任何花哨的事情。如果你想要记忆,你需要明确地编码。

除了将尾部调用视为分支以及内联小函数之外,OCaml 生成的代码与您或多或少所期望的一样。这可以说是它的优势之一(尽管你也可以称之为弱点)。