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とかでシンプルに書いたほうがよさそうですね。

非エンジニアもプログラミングを学習する時代!

「プログラミング」ってエンジニアとかプログラマーの人がするものでしょ?文系の私には関係ないや~って思っていませんか?

いまは、非エンジニアもプログラミングを学習する時代です!

「プログラミングの必修化」をご存知ですか?

  • 2020年~ 小学校で開始
  • 2021年~ 中学校で開始
  • 2022年~ 高等学校で開始
  • 2024年~ 高校受験科目に新設

学校での必修化に向けて、すでに子ども向けプログラミングスクールが多数開校されています。

あと数年もすれば、あたりまえにプログラミングができる新入社員がやってくる時代になります。

プログラミングってなに?どんなもの?まずは無料体験から試してみませんか?

 

1週間の無料体験あり!
オンラインスクール実績No.1!