2016-03-21 78 views
1

想象一下,我有以下用ocaml编写的伪代码。是否ocaml memoize递归函数

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会像记忆节点那样做一些简单的事情,这样它们就不会被重新计算。还是我无法梦想的其他奇特的东西?

回答

3

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

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

+2

另外,有关如何编写通用'memo_rec'来记忆递归函数的一步一步的解释https://realworldocaml.org/v1/en/html/imperative-programming-1.html#记忆化和动态编程 – Stas