VBA

【再帰処理をマスターしよう】VBAでフィボナッチ数列を書いてみる

ねぇもりさん、今日学校で「フィボナッチ数列」を習ったよ

1,1,2,3,5,8って足してくやつ

もり
もり
お~!それじゃあ、フィボナッチ数列をVBAで書いてみよっか!

ほら、このまえ勉強した再帰処理をつかってみよう

VBA階乗アイキャッチ
【再帰処理をマスターしよう】VBAで階乗の計算をしてみる自身への参照?呼び出す?返る?再帰処理ってむずかしいですよね。VBAで階乗の計算をして、再帰処理をマスターしてみよう!...
もりさん、グイグイくるね。まぁそういうとこキライじゃないよ

あっ、ちなみにひまわりの種の並びはフィボナッチ数列になっているそうですよ。

あとは、松ぼっくりとか、カタツムリの殻とか。

フィボナッチ数列とは?

第1項=1・第2項=1として、【2つ前の数字】と【1つ前の数字】の合計を並べたものです。

1,1,2,3,5,8,13,21,34,55・・・

※ネットで色々みると、フィボナッチ数列の第1項は0と書いてあったり、1と書いてあったりします。

この記事では第1項=1としてプログラムを実装します。

VBAでフィボナッチ数列の第n項を求める

「再帰あり」と「再帰なし」の2パターンで書いてみました。

再帰なしのパターン

 

Do~Loop文でやってることはこんな感じです。

フィボナッチ1

桁あふれを考慮して、x,y,totalはVariant型にしています。

第50項だと12,586,269,025になるんですね!

再帰ありのパターン

 

Function Fib() が Function Fib()を呼び出していますね。

Fib(10) = Fib(8) + Fib(9)

【2つ前の値】と【1つ前の値】の合計値を求めるので、第10項=第8項+第9項となります。

再帰あり・なしの実行時間を比較してみた

「再帰処理はメモリを食うから遅くなる」といった話を聞いたので、実験してみました。

第20項あたりから差がつくようです。

第n項 再帰なし 再帰あり 計算結果
20 0.001~2秒 0.004秒 6,765
25 0.023秒 75,025
30 0.216秒 832,040
35 2.29秒 9,227,465
36 3.772秒 14,930,352
37 6.145秒 24,157,817
38 9.934秒 39,088,169
39 16.065秒 63,245,986
40 26.358秒 102,334,155
45 応答なし 1,134,903,170
50 やめておく 12,586,269,025
もり
もり
再帰処理を使わないほうが圧倒的に速いね!

それにしても、これだけの計算を0.001秒でやってのけちゃうVBAってすごいですね!(人間が第50項まで計算するのは大変ですよね)

単純な処理ならば、再帰処理を使わずに、Do~Loop・For~Nextでシンプルに書いたほうがよさそうですね。

ノンプログラマーがプログラミングを学ぶ理由

ノンプログラマーがプログラミングを使えるようになると、「仕事の幅」が広がります。

日常生活にたとえると「車の運転」のイメージです。

多くの人は、大人になると自動車教習所に通って、運転の練習をしますね。F1レーサーやタクシードライバーなどの「プロ」になるわけではないのに。

車の運転ができれば、遠いところへ、速く・ラクに移動できて「生活の幅」が広がるからです。

プログラミングができるようになれば、今の仕事を速く・ラクに片づけて、「仕事の幅」を広げることができます。

「プロ」を目指す必要はありません。今の仕事をより豊かにするための「手段」、それがプログラミングです。

1週間のオンライン無料体験
いつでもどこでも今すぐ視聴OK