私がやっているFunctional Programmingコースの現在の練習課題では、特定の関数をメモしたバージョンを作る必要があります。メモ化について説明するには、次の例を与えます。このフィオナッチ関数はどのように機能しますか?
fiblist = [ fibm x | x <- [0..]]
fibm 0 = 0
fibm 1 = 1
fibm n = fiblist !! (n-1) + fiblist !! (n-2)
しかし、私はこの仕組みが完全に理解できません。
fibm 3
に電話しましょう。
fibm 3
--> fiblist !! 2 + fibList 1
--> [fibm 0, fibm 1, fibm 2] !! 2 + [fibm 0, fibm 1] !! 1
--> fibm 2 + fibm 1
--> (fiblist !! 1 + fiblist 0) + 1
--> ([fibm 0, fibm 1] !! 1 + [fibm 0] !! 0) + 1
--> (fibm 1 + fibm 0) + 1
--> 1 + 0 + 1
--> 2
他の質問/回答から
と私は何とか、評価さfiblistは呼び出しの間で共有されていることを学びましたグーグル。
これは、たとえばfiblist !! 2 + fiblist !! 1
の場合、リストの値はのために1回だけ計算され、次にfiblist !! 1
のために再計算されることを意味しますか?
次に、2つのフィボナッチ数は1回の呼び出しで1回だけ計算されるため、指数関数の呼び出し回数はありません。しかし、fiblist
機能のコールの「低い」レベルはどうですか?彼らは元のfibm
コールで計算されたfiblist
からどのように利益を得ますか?
関連する質問は、すでにS.O.今見ているのは、怠惰な評価です。 '' if(f x)> 0、f x else 0''を考えてください。ここで、 '' f x''は高価な関数呼び出しです。 if条件が真であれば '' f x''を再計算するのか、単に値を再利用するのでしょうか? – user42179
あなたの関連する質問[これを参照してください](http://stackoverflow.com/q/15084162/485115)。 –
ああ、そこにあります。ありがとうございました! – user42179