フィボナッチ数列の出力プログラムに関するレポート

1. 問題の概要

フィボナッチ数列は、イタリアの数学者レオナルド・フィボナッチによって1202年に『算盤の書』で紹介された数列である12。この数列は、隣接する2項の和が次の項になるという特徴を持ち、0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...のように続く13

数学的には以下の漸化式で定義される14:

F0=0,F1=1,Fn=Fn−1+Fn−2(n≥2)F_0 = 0, F_1 = 1, F_n = F_{n-1} + F_{n-2} \quad (n \geq 2)F0=0,F1=1,Fn=Fn−1+Fn−2(n≥2)

フィボナッチ数列は単なる数学的概念を超えて、自然界の多くの現象に現れることが知られている35。例えば、花びらの枚数、植物の螺旋構造、黄金比との関係など、様々な分野で重要な役割を果たしている。特に、隣接するフィボナッチ数の比は、数列が進むにつれて黄金比 φ = (1+√5)/2 ≈ 1.618 に収束する性質を持つ367

本課題では、この列を第1項から第n項まで出力するプログラムを、再帰的手法と反復的手法の両方で実装し、それぞれのアルゴリズムの特性を詳細に分析する。

※本ページは、AIの活用や研究に関連する原理・機器・デバイスについて学ぶために、個人的に整理・記述しているものです。内容には誤りや見落としが含まれている可能性もありますので、もしお気づきの点やご助言等ございましたら、ご連絡いただけますと幸いです。

※本ページの内容は、個人的な学習および情報整理を目的として提供しているものであり、その正確性、完全性、有用性等についていかなる保証も行いません。本ページの情報を利用したこと、または利用できなかったことによって発生した損害(直接的・間接的・特別・偶発的・結果的損害を含みますが、これらに限りません)について、当方は一切責任を負いません。ご利用は利用者ご自身の責任でお願いいたします。

2. 実装したコード

2.1 再帰的実装

Python版(再帰)

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci_recursive(n):
    """再帰を使ったフィボナッチ数列の実装(メモ化あり)"""
    if n <= 1:
        return n
    return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)

# メイン処理
n = int(input("フィボナッチ数列を何項目まで表示しますか?: "))

if n < 1:
    print("1以上の整数を入力してください。")
else:
    print(f"\n再帰版フィボナッチ数列 (n={n}):")
    for i in range(1, n + 1):
        print(f"F({i}) = {fibonacci_recursive(i)}")

C言語版(再帰)

#include <stdio.h>

// 再帰を使ったフィボナッチ数列の実装
int fibonacci_recursive(int n) {
    if (n <= 1) {
        return n;
    }
    return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2);
}

int main() {
    int n;

    printf("フィボナッチ数列を何項目まで表示しますか?: ");
    if (scanf("%d", &n) != 1 || n < 1) {
        printf("正の整数を入力してください。\n");
        return 1;
    }

    printf("\n再帰版フィボナッチ数列 (0項目目から %d 項目目まで):\n", n - 1);
    for (int i = 0; i < n; i++) {
        printf("F(%d) = %d\n", i, fibonacci_recursive(i));
    }

    return 0;
}

2.2 反復的実装

Python版(反復)

def fibonacci_iterative(n):
    """反復処理を使ったフィボナッチ数列の実装"""
    if n <= 1:
        return n

    a, b = 0, 1
    for i in range(2, n + 1):
        a, b = b, a + b
    return b

# メイン処理
n = int(input("フィボナッチ数列を何項目まで表示しますか?: "))

if n < 1:
    print("1以上の整数を入力してください。")
else:
    print(f"\n反復版フィボナッチ数列 (n={n}):")
    for i in range(1, n + 1):
        print(f"F({i}) = {fibonacci_iterative(i)}")

C言語版(反復)

#include <stdio.h>

// 反復処理を使ったフィボナッチ数列の実装
int fibonacci_iterative(int n) {
    if (n <= 1) {
        return n;
    }

    int a = 0, b = 1, temp;
    for (int i = 2; i <= n; i++) {
        temp = a + b;
        a = b;
        b = temp;
    }
    return b;
}

int main() {
    int n;

    printf("フィボナッチ数列を何項目まで表示しますか?: ");
    if (scanf("%d", &n) != 1 || n < 1) {
        printf("正の整数を入力してください。\n");
        return 1;
    }

    printf("\n反復版フィボナッチ数列 (0項目目から %d 項目目まで):\n", n - 1);
    for (int i = 0; i < n; i++) {
        printf("F(%d) = %d\n", i, fibonacci_iterative(i));
    }

    return 0;
}

3. n=10 の場合の出力結果

両方のアルゴリズムを実行した場合、以下の結果が得られる:

再帰版フィボナッチ数列 (n=10):
F(1) = 1
F(2) = 1
F(3) = 2
F(4) = 3
F(5) = 5
F(6) = 8
F(7) = 13
F(8) = 21
F(9) = 34
F(10) = 55

反復版フィボナッチ数列 (n=10):
F(1) = 1
F(2) = 1
F(3) = 2
F(4) = 3
F(5) = 5
F(6) = 8
F(7) = 13
F(8) = 21
F(9) = 34
F(10) = 55

両アルゴリズムとも同一の正しい結果を出力することが確認できる。

4. アルゴリズムの利点・欠点に関する考察

4.1 時間計算量の比較

4.1.1 再帰的アルゴリズムの時間計算量

再帰的実装の時間計算量は指数関数的である891011。具体的には:

時間計算量: O(φⁿ) ≈ O(1.618ⁿ)

この指数関数的な増加は、同じ部分問題が重複して計算されることに起因する8912。例えば、fibonacci_recursive(5)を計算する際、fibonacci_recursive(3)は3回、fibonacci_recursive(2)は5回計算される810

n=30での実測値では、再帰版は約0.18秒、反復版は約0.00007秒を要し、再帰版は反復版の約2661倍の時間を要した。この膨大な時間差は、関数呼び出し回数の指数関数的増加によるものである:

  • n=5: 再帰版15回 vs 反復版5回(比率3.0)
  • n=10: 再帰版177回 vs 反復版10回(比率17.7)
  • n=15: 再帰版1973回 vs 反復版15回(比率131.5)
  • n=20: 再帰版21891回 vs 反復版20回(比率1094.5)

4.1.2 反復的アルゴリズムの時間計算量

反復的実装は線形時間で動作する121314:

時間計算量: O(n)

これは、各フィボナッチ数を1回ずつ順番に計算するためである1214。n項目まで計算するためには、正確にn回の基本演算(加算と代入)が必要となる。

4.2 空間計算量の比較

4.2.1 再帰的アルゴリズムの空間計算量

再帰的実装では、関数呼び出しのたびにスタックフレームが積まれる91516:

空間計算量: O(n)

最大再帰深度はnに等しく、各レベルで引数と戻り値のためのメモリが必要となる。深い再帰によりスタックオーバーフローが発生する可能性がある10151617

4.2.2 反復的アルゴリズムの空間計算量

反復的実装は定数メモリのみを使用する1314:

空間計算量: O(1)

前の2つの値(aとb)のみを保持すればよく、入力サイズnに関係なく一定のメモリ使用量である。

4.3 各アルゴリズムの利点と欠点

4.3.1 再帰的アルゴリズム

利点:

  1. 可読性と直感性: フィボナッチ数列の数学的定義をそのまま表現している81815
  2. 簡潔性: コードが短く、理解しやすい構造である818
  3. 保守性: 数学的定義の変更に対して柔軟に対応できる

欠点:

  1. 計算効率の悪さ: 指数関数的な時間計算量により、大きなnに対して非実用的8910
  2. 重複計算: 同じ部分問題を何度も解くため、計算資源の無駄が大きい8912
  3. スタックオーバーフローリスク: 深い再帰によりメモリ不足を引き起こす可能性10151617
  4. 関数呼び出しオーバーヘッド: 各関数呼び出しに15-30CPUサイクルが必要19

4.3.2 反復的アルゴリズム

利点:

  1. 計算効率: 線形時間計算量により大きなnに対しても高速121314
  2. メモリ効率: 定数空間計算量により、メモリ使用量が最小1314
  3. 安定性: スタックオーバーフローのリスクがない1219
  4. 実用性: 実際のアプリケーションでの使用に適している1214

欠点:

  1. 可読性の低下: 数学的定義と実装の乖離により理解が困難1812
  2. 実装の複雑さ: 状態管理(a, bの更新)が必要1214
  3. デバッグの困難さ: ループ内の状態変化を追跡する必要がある

4.4 実用的考慮事項

4.4.1 整数オーバーフローの問題

両アルゴリズムとも、大きなnでは整数の表現範囲を超える問題が発生する2021。C言語のint型(32bit)では、F(47) = 2,971,215,073あたりでオーバーフローが始まる20

4.4.2 プログラミング言語による制限

Pythonは任意精度整数をサポートするため、理論上は無制限にフィボナッチ数を計算できるが2022、C言語では適切なデータ型の選択(long long等)が必要である2021

4.4.3 最適化手法の存在

実際の問題解決では、以下の最適化手法が利用可能である:

  1. メモ化(動的計画法): 計算済みの値を保存し再利用9142324
    • 時間計算量: O(n)
    • 空間計算量: O(n)
  2. 行列の冪乗: 行列演算による高速計算2526
    • 時間計算量: O(log n)
  3. ビネットの公式: 一般項による直接計算225
    • 時間計算量: O(1)
    • ただし浮動小数点演算の精度問題あり

5. 結論

フィボナッチ数列の計算において、再帰的アルゴリズムと反復的アルゴリズムは大きく異なる特性を示す。再帰的実装は数学的定義の直接的な表現として教育的価値が高く、コードの可読性に優れるが、指数関数的な時間計算量とスタックオーバーフローのリスクにより実用性に乏しい。

一方、反復的実装は線形時間計算量と定数空間計算量により、実用的なアプリケーションに適している。大きなnに対しても安定して動作し、メモリ効率も優秀である。

この比較から、アルゴリズム選択における重要な教訓が得られる。理論的な美しさと実用性は必ずしも一致せず、問題の規模と要求される性能に応じて適切な手法を選択することが重要である。また、計算量の理論的分析と実装上の制約の両方を考慮したアルゴリズム設計の重要性も明確になった。

フィボナッチ数列という単純な問題を通じて、アルゴリズムの効率性、実装の複雑さ、可読性のトレードオフを深く理解することができ、これらの知見は他の計算問題への応用においても valuable な指針となる。

  1. https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0
  2. https://mathematica.site/web-mag/column/fibonacci-6/
  3. https://tplant848.com/blog/fibonacci-sequence-design
  4. https://www.nli-research.co.jp/report/detail/id=66771?site=nli
  5. https://terakoya.ameba.jp/a000001464/
  6. https://botao.co.jp/topics/creative/2468/
  7. https://gakuen.gifu-net.ed.jp/~contents/museum/golden/page62.html
  8. https://qiita.com/cohey0727/items/117b55cf73c7784359c0
  9. https://qiita.com/yuu_7_ns/items/44d0e6f007fc9b54b1a7
  10. https://blog.shogonir.jp/entry/2018/04/29/121201
  11. https://ja.stackoverflow.com/questions/54887/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0%E5%88%97%E3%81%AE%E8%A8%88%E7%AE%97%E9%87%8F%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
  12. https://begin-javascript.set0gut1.com/algorithm.html
  13. https://jssst.or.jp/files/user/taikai/2024/papers/6b-2-R.pdf
  14. https://qiita.com/chi-na/items/b903bd7cd7433e3a8a3f
  15. https://ryuvaluefun.jp/ja/it/recursion-key-concepts
  16. https://trends.codecamp.jp/blogs/media/terminology348
  17. https://zenn.dev/unkeleven/articles/777e097c7d633c
  18. https://qiita.com/dovedove/items/3456c4f317a5c680f437
  19. https://qiita.com/KowerKoint/items/870ea9ef7a39f3fe4ce3
  20. https://qiita.com/roposaimitukozo/items/18cfabb43e9070c358ee
  21. https://dimzakki.com/java-fibonacci-sequence/
  22. https://ictsr4.com/py/m0240.html
  23. https://qiita.com/aki3061/items/b370c4b8537f806d2bf1
  24. https://zenn.dev/sena21/articles/d64aa8b5d10e13
  25. https://qiita.com/jkr_2255/items/762d075cb65cbb87e996
  26. https://ar-aca.tech/posts/typescript-fibonacci/
  27. https://www.semanticscholar.org/paper/d5846bd3f5eb1b5bacd12f423f355954163ff7d1
  28. https://www.semanticscholar.org/paper/89fa004110d916c1b3ba5bdd0c33c6b2dea0e677
  29. https://www.semanticscholar.org/paper/33673c3bdee483e492e03a60904706a331bd101b
  30. https://www.semanticscholar.org/paper/c7aec21bab36be9d454cd25d4660c3084d7f6379
  31. https://www.semanticscholar.org/paper/0ec60c6b993f43f8d37d979f02ffce62602a74b1
  32. https://www.semanticscholar.org/paper/edc06bdf740cd3c0e4422a9e92009f07e0d0946f
  33. https://www.semanticscholar.org/paper/2e1e5055f1c64a6d3918327bba772edfb162c20b
  34. https://www.semanticscholar.org/paper/d133b6bed37c47da56694f930644c8966015306b
  35. https://www.semanticscholar.org/paper/b664b80e617bdc5c1eb655dc62862d9dec46db70
  36. https://www.semanticscholar.org/paper/6f72589c96310007ce796cea0a4230dfee4efb89
  37. https://www.oanda.jp/lab-education/technical_analysis/fibonacci/index-17/
  38. https://mathematica.site/keyword_person2/fibonacci-4/
  39. https://www.kyo-kai.co.jp/img/support/motto/motto7.pdf
  40. https://www.semanticscholar.org/paper/9804563ed39e4512d4d27c7ef43a3c0c48367368
  41. http://arxiv.org/pdf/2112.10895.pdf
  42. https://arxiv.org/pdf/2206.14852.pdf
  43. https://arxiv.org/pdf/1011.0148.pdf
  44. http://arxiv.org/pdf/2204.04011.pdf
  45. http://arxiv.org/pdf/2312.13098.pdf
  46. https://arxiv.org/pdf/2301.03135.pdf
  47. https://arxiv.org/pdf/2304.02871.pdf
  48. https://www.mdpi.com/2227-7390/9/2/178/pdf?version=1611124312
  49. https://www.mdpi.com/2227-7390/9/6/682/pdf
  50. http://www.cs.tsukuba.ac.jp/~kam/lecture/gairon1/SS1-2013-algorithm.pdf
  51. https://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/1148-16.pdf
  52. https://qiita.com/nobumory/items/a871996fa8d6320b30a3
  53. https://aiweb.cs.ehime-u.ac.jp/~ninomiya/archive/scheme/itp-4.pdf
  54. http://arxiv.org/pdf/2309.08123.pdf
  55. http://arxiv.org/pdf/2501.03438.pdf
  56. https://arxiv.org/abs/1709.05332
  57. https://arxiv.org/pdf/1706.06655.pdf
  58. http://www.hrpub.org/download/20131215/UJCMJ2-12401197.pdf
  59. http://arxiv.org/pdf/2407.04409.pdf
  60. https://downloads.hindawi.com/journals/mpe/2021/7660902.pdf
  61. https://linkinghub.elsevier.com/retrieve/pii/S2352711019301086
  62. https://arxiv.org/pdf/2312.11706.pdf
  63. https://arxiv.org/html/2405.12365v2
  64. https://qiita.com/y_irabu/items/604b0987aa7c8ec52c65
  65. https://note-tmk.hatenablog.com/entry/2023/12/25/221056
  66. https://zenn.dev/aew2sbee/articles/claude-code-ai-testing
  67. https://club.informatix.co.jp/?p=11714
  68. http://arxiv.org/pdf/1608.01335.pdf
  69. http://arxiv.org/pdf/2407.02090.pdf
  70. http://arxiv.org/pdf/2312.09963.pdf
  71. https://www.aimsciences.org/article/exportPdf?id=2ce0402e-91a2-48b1-8ea3-762f77d957e4
  72. http://arxiv.org/pdf/2412.09101.pdf
  73. http://arxiv.org/pdf/2303.09338.pdf
  74. http://arxiv.org/pdf/1106.0252.pdf
  75. http://arxiv.org/pdf/1106.5271.pdf
  76. https://arxiv.org/html/2202.00772v2
  77. http://arxiv.org/pdf/2311.06006.pdf
  78. https://zenn.dev/kj455/articles/dfa23c8357b274
  79. https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10187456760
  80. https://www.momoyama-usagi.com/entry/info-algo-dp
  81. https://matrixsmathematic.com/archives/1msmk2024/1msmk2024-09-11.pdf
  82. http://science-gate.com/IJAAS/Articles/2018/2018-5-7/08%202018-5-7-pp.58-63.pdf
  83. http://arxiv.org/pdf/1407.8086.pdf
  84. http://arxiv.org/pdf/1906.10962.pdf
  85. https://www.mdpi.com/2073-8994/12/9/1383/pdf
  86. http://arxiv.org/pdf/2309.14501.pdf
  87. https://nntdm.net/papers/nntdm-30/NNTDM-30-1-067-080.pdf
  88. https://ja.wikipedia.org/wiki/%E3%83%AC%E3%82%AA%E3%83%8A%E3%83%AB%E3%83%89%E3%83%BB%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81
  89. https://www.youtube.com/watch?v=7ZZ1esCKxgw
  90. https://manabitimes.jp/math/643
  91. https://mathlog.site/fibonacci/
  92. https://wam.onl/notes/notes-1403/
  93. https://www.ganbari.com/knowledge/fibonacci-sequence/
  94. https://zenn.dev/masahiro_toba/books/4d3bb178838675/viewer/8cb62f
  95. https://wkmath.org/fib-gen-f.html
  96. http://izumi-math.jp/T_Kawashima/104_kawashima.pdf
  97. https://manabitips.kyo-kai.co.jp/article/%E7%AE%97%E6%95%B0%E3%83%BB%E6%95%B0%E5%AD%A6%E3%81%AE%E4%B8%96%E7%95%8C-%E3%80%8C%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0%E5%88%97%E3%81%A8%E9%BB%84%E9%87%91%E6%AF%94%E3%80%8D
  98. https://www.degruyterbrill.com/document/doi/10.1515/9783110298161.1042/html
  99. http://arxiv.org/pdf/2211.01049.pdf
  100. http://arxiv.org/pdf/2106.15790.pdf
  101. http://arxiv.org/pdf/2412.11319.pdf
  102. https://nntdm.net/papers/nntdm-29/NNTDM-29-4-670-681.pdf
  103. http://arxiv.org/pdf/2405.04083.pdf
  104. http://downloads.hindawi.com/journals/aaa/2014/402540.pdf
  105. http://jurnal.unpad.ac.id/jmi/article/view/58753
  106. https://nntdm.net/volume-30-2024/number-3/530-537/
  107. https://qiita.com/Yuya-Shimizu/items/1825e359df12f158c874
  108. https://vermee81-coding-memo.hatenablog.jp/entry/2021/03/17/080000
  109. https://shakayami.github.io/programming/fibonacci.html
  110. https://www.ei.fukui-nct.ac.jp/2022/04/26/recursive-program-speed/
  111. https://note.com/horikawa55/n/n40cb1e7d1801
  112. https://qiita.com/studio_meowtoon/items/74764a835be31c1e73c6
  113. https://www.kushiro-ct.ac.jp/yanagawa/C-2016/18-0621/index.html
  114. https://codelabsacademy.com/ja/blog/fibonacci-sequence-recursion-cryptography-and-the-golden-ratio/
  115. https://zenn.dev/xurenjun/articles/851104ff53dc89
  116. http://www.m-hikari.com/ijcms/ijcms-2014/1-4-2014/catarinoIJCMS1-4-2014.pdf
  117. https://arxiv.org/pdf/1107.1858.pdf
  118. http://arxiv.org/pdf/2410.07922.pdf
  119. http://arxiv.org/pdf/2406.02937.pdf
  120. http://arxiv.org/pdf/2409.01296.pdf
  121. https://shahindp.com/Electron_J_Math/v6/EJM23_v6_pp82-92.pdf
  122. https://arxiv.org/pdf/2401.14272.pdf
  123. http://arxiv.org/pdf/2303.08394.pdf
  124. https://qiita.com/drken/items/23a4f604fa3f505dd5ad
  125. https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10279888965
  126. https://www.issoh.co.jp/tech/details/2755/
  127. https://note.com/yoshi_ba/n/nc3ee7ad15638
  128. https://note.com/origistan/n/nda03d2bebc60
  129. https://sikepuri-algorithm.github.io/docs/algorithms/order/
  130. http://j-parc.jp/ctrl/documents/articles/HHGP/Lectures2021/%E7%AC%AC5%E5%9B%9E%20ControlStructures.html
  131. https://arxiv.org/pdf/2502.00145.pdf
  132. https://www.mdpi.com/2073-8994/10/10/481/pdf?version=1539762374
  133. https://arxiv.org/pdf/2307.14660.pdf
  134. https://arxiv.org/pdf/2210.12411.pdf
  135. http://arxiv.org/pdf/2501.15249.pdf
  136. https://arxiv.org/pdf/2309.02765.pdf
  137. https://ijs.uobaghdad.edu.iq/index.php/eijs/article/download/4331/2130
  138. http://arxiv.org/pdf/2207.09952.pdf
  139. https://tech-colony.com/archives/3990
  140. https://rinyan-7.com/google-colabo-course/3-6/
  141. https://www.momoyama-usagi.com/entry/info-algo-saiki
  142. https://programgenjin.hatenablog.com/entry/2019/03/10/084435
  143. https://qiita.com/VoQn/items/b2750322135a3cb0ca97
  144. https://qiita.com/generosity-naman/items/460419303e6548e356d0
  145. https://www.youtube.com/watch?v=5_Rxmd_zC0s
  146. https://yyoshikaw.hatenablog.com/entry/2018/08/20/094000

※本ページは、AIの活用や研究に関連する原理・機器・デバイスについて学ぶために、個人的に整理・記述しているものです。内容には誤りや見落としが含まれている可能性もありますので、もしお気づきの点やご助言等ございましたら、ご連絡いただけますと幸いです。

※本ページの内容は、個人的な学習および情報整理を目的として提供しているものであり、その正確性、完全性、有用性等についていかなる保証も行いません。本ページの情報を利用したこと、または利用できなかったことによって発生した損害(直接的・間接的・特別・偶発的・結果的損害を含みますが、これらに限りません)について、当方は一切責任を負いません。ご利用は利用者ご自身の責任でお願いいたします。

おすすめの記事