エクセル関数応用
フィボナッチ、トリボナッチ、テトラナッチ数列を1数式で作成

Excel関数の解説、関数サンプルと高等テクニック
公開日:2025-10-23 最終更新日:2025-10-23

フィボナッチ、トリボナッチ、テトラナッチ数列を1数式で作成


フィボナッチ数列、トリボナッチ数列、テトラナッチ数列は、いずれも前の項の和によって次の項が定義される数列ですが、何項前までの和を取るかが異なります。

数列の名称 定義(次の項) 初期値の例 数列の例(初期値を含む)
フィボナッチ 直前の 2項 の和 0, 1 0, 1, 1, 2, 3, 5, 8, 13, …
トリボナッチ 直前の 3項 の和 0, 0, 1 0, 0, 1, 1, 2, 4, 7, 13, …
テトラナッチ 直前の 4項 の和 0, 0, 0, 1 0, 0, 0, 1, 1, 2, 4, 8, 15, …


以下で紹介している数式は、あくまで1例です。
いろいろな数式の書き方があるので、ぜひ挑戦してみてください。



フィボナッチ、トリボナッチ、テトラナッチ数列を1数式

フィボナッチ、トリボナッチ、テトラナッチ数列を1数式で作成

=LAMBDA(n,t,
  LET(
    fn,LAMBDA(n,m,
      REDUCE(
        MAKEARRAY(
          m,1,
          LAMBDA(r,c,--(r=m))
        ),
        SEQUENCE(n-m),
        LAMBDA(x,y,
          VSTACK(x,SUM(TAKE(x,-m)))
        )
      )
    ),
    DROP(REDUCE("",t,LAMBDA(x,y,HSTACK(x,fn(n,y)))),,1))
)(A3,B2:D2)

数式の説明
セルA3で指定された項数まで、セルB2:D2で指定された種類(k=2 フィボナッチ、k=3 トリボナッチ、k=4 テトラナッチなど)の数列を同時に生成し、横に並べて出力します。

数式の全体像と役割


関数名 セル参照 役割
外側の LAMBDA (A3, B2:D2) 数列の項数($n$)と種類($t$)を受け取るメイン関数。
LET 計算過程で使用するカスタム関数 fn を定義し、最終的な計算を実行します。
fn 任意の k(m と表記)のk-ボナッチ数列を生成するカスタム LAMBDA 関数。
REDUCE (内側) 数列の初期値から開始し、1項ずつ計算して積み重ねる反復処理を実行。
REDUCE (外側) 種類のリスト t(B2:D2)を順に処理し、各数列を横に連結(HSTACK)します。

詳細な解説
数式は大きく「数列生成関数 fn の定義」と「数列の並列生成と出力」の2つの部分に分かれます。
1. カスタム関数 fn の定義
この LAMBDA 関数は、項数 n と数列の種類 m(何項前までの和を取るか)を入力として、指定された m-ボナッチ数列を生成します。
fn, LAMBDA(n,m,REDUCE(初期値生成, 繰り返し回数, 反復処理))

a. 数列の初期値生成 (MAKEARRAY の部分)
m-ボナッチ数列は、次の項を計算するために m 個の初期値が必要です。通常、m-1 個の 0 と最後の 1 から始まります(例:m=3 なら 0, 0, 1)。
MAKEARRAY(m,1,LAMBDA(r,c,--(r=m)))
  • これは m 行 1列の配列を作成します。
  • LAMBDA(r, c, …) は、行番号 r が m と等しい場合(配列の最終行)に 1 を、それ以外に 0 を設定します。
  • これが REDUCE の初期値 x となります。

b. 反復処理の実行 (REDUCE の部分)
数列の初期値に続けて、次の項を計算して積み重ねる作業を n-m 回繰り返します。
SEQUENCE(n-m), LAMBDA(x,y, VSTACK(x,SUM(TAKE(x,-m))))
  • 繰り返し回数 (SEQUENCE(n-m)): 初期値が m 項あるため、残りの n-m 項を生成します。
  • 反復処理 (LAMBDA(x, y, …))
    • x は現在の数列の配列です。
    • TAKE(x, -m): 配列 x の末尾 m 個の項を取り出します。
    • SUM(…): その m 個の項の和(これが次の項)を計算します。
    • VSTACK(x, …): 現在の配列 x の下に新しい項を結合(積み重ね)します。

2. 数列の並列生成と出力 (DROP と REDUCE の部分)
外側の REDUCE は、入力された種類 t(B2:D2)の各要素を処理し、生成された数列を横に並べます。
DROP(REDUCE("", t, LAMBDA(x,y, HSTACK(x, fn(n,y)))),,1)
  • REDUCE("", t, …)
    • 初期値 (""): 空の文字列から処理を開始します。
    • 反復処理 (LAMBDA(x, y, …))
      • x はこれまでに生成され横に連結された数列の配列です。
      • y は B2:D2 の要素(種類 m)です。
      • HSTACK(x, fn(n, y)): 既存の配列 x の右に、新しく fn で生成した数列を結合します。
  • DROP(…,, 1)
    • HSTACK の初期値として空文字列 ("") を使ったため、出力の最初の列が空欄になります。
    • DROP(配列,, 1) は、その最初の1列を削除する(ドロップする)役割を果たし、結果として生成された数列だけを返します。

Grokの作成した数式:似たような数式なので参考まで

=LET(
  g,LAMBDA(o,l,
    REDUCE(
      VSTACK(
        MAKEARRAY(o-1,1,LAMBDA(r,c,0)),
        1
      ),
      SEQUENCE(l-o),
      LAMBDA(a,_,VSTACK(a,SUM(TAKE(a,-o))))
    )
  ),
  inputs,B2:D2,
  DROP(
    REDUCE("",inputs,LAMBDA(acc,o,HSTACK(acc,g(o,20)))),
    ,1
  )
)

数式の解説:Grok自身による
この数式は、LAMBDAを使ってn次ナッチ数列を生成します。
- g: LAMBDA関数で、次数oと長さlの数列を作成。初期配列(o-1個の0と1)からREDUCEで直前o個の和を追加。
- inputs: B2:D2の次数値。
- REDUCE: inputsをループし、各oでg(o,20)をHSTACKで結合。初期値""をDROPで除去。
これでB3に貼り付けると、20行の数列が横にスピルします。




同じテーマ「エクセル関数応用」の記事

セル参照を戻り値とする関数
REDUCE+VSTACKが遅い理由と解決策
HSTACKは速い?遅い?実際に試してみた結果
条件付きMEDIAN関数を作る|LAMBDA関数で汎用〇〇IFSを実現
複数列の直積(デカルト積、クロスジョイン)
フィボナッチ、トリボナッチ、テトラナッチ数列を1数式で作成
表データから複数条件による複合抽出 (横AND/縦OR)
配列を自在に回転させる数式
掛け算(*)を使わない掛け算|足し算(+)を使わない足し算
2段階の入力規則リスト作成:最新関数対応
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ