私はフィボナッチのcaculationを最適化するためのメモアイテクニックを使用しようとしました。私のコードは次のとおりです。フィボナッチシリーズに適用されたときにocaml memoizationが失敗しました
let memo f =
let vtable = ref [] in
let rec match_function x vt=
match vt with
|(x',y)::_ when x=x' -> y
|_::l ->
match_function x l
|[] ->
let y = (f x) in
vtable := (x,y):: !vtable;
y
in
(fun x -> (match_function x !vtable));;
let rec ggfib = function
0|1 as i -> i
|x -> ggfib(x-1) + ggfib(x-2);;
let memoggfib = memo ggfib;;
let running_time f x =
let start_time = Sys.time() in
let y = f x in
let finish_time = Sys.time() in
Printf.printf "Time lapse:%f\n" (finish_time -. start_time);
y;;
running_time ggfib 30;;
running_time memoggfib 30;;
出力は次のようになります。
Time lapse:0.357187
Time lapse:0.353663
差はそれほどではありません...なぜ?そして、私は
running_time ggfib 40;;
running_time memoggfib 40;;
プログラムを使用して40でフィボナッチを計算しようとしたとき、さらに悪い無限ループに実行し、出力を停止するように見えます。
ここで何が間違っていますか?私が気にしなかった問題は何ですか?
上記のコードを変更して、メモ化のための静的なvtableを導入しました。
let rec ggfib = function
0|1 as i -> i
|x -> ggfib(x-1) + ggfib(x-2);;
let running_time x0 =
let vtable = ref [] in
let start_time = Sys.time() in
let x = ref 1 in
let rec match_function ff x vt=
match vt with
|(x',y)::_ when x=x' -> y
|_::l ->
match_function ff x l
|[] ->
let y = (ff x) in
vtable := (x,y):: !vtable;
y
in
let y=ref 1 in
while !x<x0 do
y:= match_function ggfib !x !vtable;
x:=!x+1;
done;
let finish_time = Sys.time() in
Printf.printf "Time lapse:%f\n" (finish_time -. start_time);
y;;
let running_time2 x0=
let start_time = Sys.time() in
let x = ref 1 in
while !x<x0 do
ggfib !x;
x:=!x+1;
done;
let finish_time = Sys.time() in
Printf.printf "Time lapse:%f\n" (finish_time -. start_time);;
running_time 40;;
running_time2 30;;
これは基本的に同じ動作をします。私は大幅な改善が見られませんでした....
Time lapse:0.581918
Time lapse:0.577813
ありがとうございました!!!いつかあなたの投稿を考えてみてください。新しい学習者のためにたくさん噛んでください。 – lkahtz