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項ぐらいまでやってみると次のように表示されます。

以外に早く収束するのですね。もう少しやってみると

コンピュータの計算誤差の関係でこれ以上やっても無駄でしょう。表示桁を増やしても同じです。

精度を上げるには,計算アルゴリズムを変え,プログラミング言語も変える必要があります。