【Java】フィボナッチ数列をプログラミングで表現してみる【JavaScript】

今回はJavaとJavaScriptを使って、数学的に有名な数列であるフィボナッチ数列をプログラミングで作りたいと思います。また、フィボナッチ数列と黄金比との比較もプログラミングで行ってみます。
フィボナッチ数列とは
フィボナッチ数列は以下のような数列のことを指します。
0,1,1,2,3,5,8,13,21,34,…
この数列 Fn は、1番目を F0=0 、2番目を F1=1 として、それ以降は1つ前と2つ前の数字を足した数字
Fn+2=Fn+Fn+1 (n≥0)
になります。
ここで、フィボナッチ数列の隣同士の数字の比は、数列の項が後ろになればなるほど黄金比と呼ばれる 1:1+√52 に近似されるという特徴があります。
Javaでフィボナッチ数列を出力する
では、配列とfor文を使ってフィボナッチ数列を10番目まで出力させてみましょう。今回、配列を出力させるのにArraysクラス
のtoStringメソッド
を使っています。
フィボナッチ数列の比と黄金比との差も求めてみましょう。sqrtメソッド
を使って黄金比を出し、指定した数列の項の比との差を求めます。メソッドについては以下の記事にまとめています。
1import java.util.Arrays;
2
3public class FibonacciSequence {
4
5 /** フィボナッチ数列を格納する配列 */
6 private long[] array;
7
8 /** 黄金比 */
9 private static final double gold = (1 + Math.sqrt(5)) / 2;
10
11 /** フィボナッチ数列の比と黄金比との差 */
12 private double difference;
13
14 /** 実行用mainメソッド */
15 public static void main(String[] args) {
16 FibonacciSequence fSequence = new FibonacciSequence();
17 fSequence.getFibonacciSequence(5);
18 System.out.println(Arrays.toString(fSequence.array));
19 System.out.println("黄金比との差:" + fSequence.difference);
20 fSequence.getFibonacciSequence(10);
21 System.out.println(Arrays.toString(fSequence.array));
22 System.out.println("黄金比との差:" + fSequence.difference);
23 }
24
25 /**
26 * フィボナッチ数列と黄金比との差を取得
27 *
28 * @param num 出力する数列の長さ
29 */
30 private void getFibonacciSequence(int num) {
31 if (num < 3) {
32 num = 2;
33 }
34 array = new long[num];
35 // 配列の1番目と2番目に0と1を格納する
36 array[0] = 0;
37 array[1] = 1;
38 // 3番目以降に1つ前と2つ前の数字を足した数字を入れる
39 for (int i = 2; i < num; i++) {
40 array[i] = array[i - 1] + array[i - 2];
41 }
42 difference = gold - ((double) array[num - 1] / (double) array[num - 2]);
43 }
44}
1[0, 1, 1, 2, 3]
2黄金比との差:0.1180339887498949
3[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
4黄金比との差:-0.0010136302977241662
プログラム上でも、先ほど説明した数列と同じものが出力されたことがわかります。今回は比較のため引数は「5」、「10」の2回出力結果を出しました。出力結果を見ると、数字が大きい程、黄金比との差が小さくなることがわかります。
JavaScriptでフィボナッチ数列を出力する
JavaScript
で書いた場合だと以下の様になります。あまり違いはありませんね。
1function fibonacciSequence(num) {
2 let array = new Array(num);
3 array[0] = 0;
4 array[1] = 1;
5 for (let i = 2; i < num; i++) {
6 array[i] = array[i - 1] + array[i - 2];
7 }
8 const gold = (1 + Math.sqrt(5)) / 2
9 const difference = gold - array[num - 1] / array[num - 2];
10}
入力した数値の長さのフィボナッチ数列と黄金比との差を返すツールのようなものを作成してみました。入力可能数値は最大50となっており、それ以上の数値を入力した場合でも50として計算させています。
数列の長さを入力(最大50まで):
黄金比との差:
実行結果はJavaのものと同じになることも分かります。
今回はJavaとJavaScriptでフィボナッチ数列を出力してみました。
フィボナッチ数列は自然界にも現れることの多い不思議な数列です。「花びらの枚数」だったり「気管支の枝分かれ」にもフィボナッチ数列と関わりがあるようです。
プログラミングでフィボナッチ数列を表現する問題は、プログラミング初級者向けに良く見られるのでまとめてみました。以上で記事を終わりにします。