練習問題 8.4
参照と繰り返しの構文 (while, for)を使って、フィボナッチ数を求める関数を定義しなさい。
解答
let fib n =
if (n < 3) then 1
else
let mem1 = ref 1;
and mem2 = ref 1;
and mem3 = ref 1
in
let x = ref 3 in
while (!x <= n) do
mem1 := !mem2;
mem2 := !mem3;
mem3 := (!mem1 + !mem2);
x := !x + 1
done;
!mem3;;
書き換え可能なデータとして、mem1, mem2, mem3 を用意する。
初期値には、3つとも 1 への参照をいれておく。
x も書き換え可能なデータで、カウント用である。
!x = 3 のとき、
mem1 に mem2 が参照している値 1 を代入。
mem2 に mem3 が参照している値 1 を代入。
mem3 には、今、mem1 と mem2 にセットされた値の合計、すなわち 2 を代入する。
そして、x が参照している値を +1 しておく。
もし、n が 3 ならば、!x = n となるので、mem3 すなわち 2 が答えとして返される。
ちがうならば、!x = 4 の段階にはいる。
mem1 に mem2 が参照している値 1 が代入される。
mem2 に mem3 が参照している値 2 が代入される。
mem3 には、!mem1 と !mem2 の合計、すなわち 3 が代入される。
もし、n が 4 ならば、!mem3 すなわち 3 が答えとなる。
このように処理がすすんでいく。