D04 フィボナッチ数列
フィボナッチ数列は隣接3項間の漸化式で表されるので,順にリストに格納していけばよいのです。
フィボナッチ数列の第n項だけを求めたい場合は,これを関数化して,最後の要素だけを返すようにします。
Cindyscriptでのユーザー定義関数の戻り値は,最後に評価した値です。
fibo(m):=(
seq=[1,1];
repeat(m-2,n,start->2,
a2=seq_(-2);
a1=seq_(-1);
b=a2+a1;
seq=append(seq,b);
);
seq_(-1);
);
必要なのはすべての項ではないので,変数を2つだけ用意して次のようにすることもできます。
fibo(m):=(
a1=1;
a2=1;
repeat(m-2,
w=a1+a2;
a1=a2;
a2=w;
);
a2;
);
フィボナッチ数列と黄金比
フィボナッチ数列の隣接する2項の比は黄金比に収束するのでした。
その様子を調べてみましょう。
たとえば,第15項くらいまでで調べるとして,そのまま
repeat(15,s,
println(fibo(s+1)/fibo(s));
);
とするのでは,あまりうまくいきません。
というのは,Cindyscriptでは,自動的に小数点以下4位まで丸めて表示するからです。
そこで,format() 関数を用いて,桁数を指定します。
小数点以下10位くらいでよいでしょう。
println(s+":"+format((1+sqrt(5))/2,10)+":"+format(fibo(s+1)/fibo(s),10));
とします。項の番号に続いて黄金の値,2項間の比を表示します。
これで,第20項ぐらいまでやってみると次のように表示されます。
以外に早く収束するのですね。もう少しやってみると
コンピュータの計算誤差の関係でこれ以上やっても無駄でしょう。表示桁を増やしても同じです。
精度を上げるには,計算アルゴリズムを変え,プログラミング言語も変える必要があります。