ocaml是否会记忆递归函数

时间:2016-03-21 05:44:04

标签: ocaml memoization

想象一下,我有以下用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会做一些整洁的事情,比如记住节点,这样就不会重新计算它们。或者其他一些我无法想象的奇特之处?

1 个答案:

答案 0 :(得分:3)

不,OCaml对这段代码没有任何兴趣。如果您想要进行记忆,则需要明确地对其进行编码。

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

相关问题