フィボナッチ数列とは
フィボナッチ数列とは、
$$1,1,2,3,5,8,13,21,\cdots$$のように、一つ前の数字と足し合わせていく数列のことです。
最初に「1」が2つあると思いますが、次のように考えてみてください。
$$0,1,1,2,3,5,8,13,21,\cdots$$
例えば今$n$番目の数に居るとき、次の数にするには、
a_{n+1} = a_n + a_{n-1}\;(n\geqq0)\quad\cdots\quad{\color{red}\clubsuit}
という計算式を立てればプログラムでも組めそうですよね!
例)3 = 2 + 1
例)5 = 3 + 2
今回は今立てたこの式を元にC言語でフィボナッチ数列生成プログラムを組んでいこうと思います。
参考 : フィボナッチ数列とは?黄金比と一致する証明や一般項の求め方をわかりやすく解説
C言語でプログラミング
まず、C言語の書き方を知っている必要がありますが、そこに関しては今回説明しませんのでご了承ください。
コードを次のように書いてみました。
#include <stdio.h>
int main(void){
// n番目までのフィボナッチ数を表示
int n;
printf("フィボナッチ数列を何番目まで表示しますか? > ");
scanf("%d", &n);
// フィボナッチ数列の作成
int arr[n], i;
arr[0] = 0;
arr[1] = 1;
for(i=1; i<=n; i++){
arr[i+1] = arr[i] + arr[i-1];
printf("%d, ", arr[i]);
}
printf("\n");
return 0;
}
完成したこのコードをGCCコンパイルして実行してみます。
実行すると...
このように表示されました!
「5」と入力したから最後が「5」で終わったわけではありません。
5番目のフィボナッチ数で終わるという意味です。
コード(fib.c)で言うと、6行目で変数$n$に入力した値が代入されているわけです。
そして、$\color{red}{\clubsuit}$のように次の数、次の数と計算するには繰り返す必要があるので、今回はfor文を使ってループさせていきます。
このとき、何番目まで表示するかを入力した変数$n$を使って、ループさせる区間を決めます。
さて、これでフィボナッチ数列を生成するC言語のコードが書けました!!
と思うのはまだ早い!!
C言語の特徴として、計算は速いが膨大な数を扱うとオーバーフローする可能性があることがあげられます。
そうなんです。試しに入力の際に「100」を入力してみましょう。
実行するとこのようになってしまいました。
おかしいですよね、フィボナッチ数列は自然数になるはずです。
それなのに負の数が出てきてしまいました。誰がどう見ようと、明らかにこれは不正確です。
ということでC言語でも対処をすれば大きい数を扱えるようになりますが、今回はここでC言語を扱うのはやめてPythonに切り替えてみようと思います。
Pythonでプログラミング
ここからはPythonでフィボナッチ数列を生成していきます。
「いや、あまえんなよ!!」と思う方も居るでしょう。
はい、あまえてしまいました...
Pythonの特徴として、処理速度はC言語に比べると遅いが、膨大な数を取り扱えるという利点があります。
【比較表】
処理速度 | オーバーフロー | |
---|---|---|
C言語 | 速い | しやすい |
Python | 遅い | しづらい |
というわけで、Pythonで書いたコードがこちらです。
n = int(input("フィボナッチ数列を何番目まで表示しますか? > "))
i=1
arr = [0,1]
while i<n:
arr.append(arr[i]+arr[i-1])
i += 1
print(arr[1:])
Pythonの場合はリストを活用します。
やっぱり簡潔に書けて良いですね!(主Python好き)
このコード(fib.py)を実行すると、
はい!!100番目のフィボナッチ数を表示しても全く問題ありません!!
こちらのサイトで合っているか確認してみましょう!
参考 : フィボナッチ数列一覧表