2016-03-21 6 views
1

私はocamlで次の擬似コードを書いているとします。ocamlは再帰関数をメモします

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

つまり、再帰的に定義された関数を計算しています。

上記はテール再帰的ではありません。 (n-1、d-1)foo(n-1、d-1)の計算によってfoo(n-1、d-1)が再び呼び出されるように、

のような多くの冗長な作業が行われます。私はこれを動的プログラミング問題として手作業で書くことができることを知っています。私はここに興味がありません

私がこのように書くと、ocamlはノードをメモして再計算されないようにします。または私が夢見ることができない他の空想的なもの?

答えて

3

いいえ、OCamlはこのコードで何も気にしません。メモを必要とする場合は、明示的にコードを記述する必要があります。

尾呼び出しを枝として扱い、小さな関数をインライン展開するのとは別に、OCamlは多かれ少なかれ期待するコードを生成します。これは間違いなくその強みの1つです(ただし、弱点とも言えます)。

+2

また、汎用的な 'memo_rec'を記述して、再帰関数をメモ書きする方法について、段階的に説明しています。https://realworldocaml.org/v1/en/html/imperative-programming-1.html#メモ化と動的プログラミング – Stas