エクセル関数応用
フィボナッチ、トリボナッチ、テトラナッチ数列を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行の数列が横にスピルします。




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

QRコード、バーコード作成の覚え書き
GROUPBY関数が最強すぎる!Excelの集計作業が爆速に!
セル参照を戻り値とする関数
REDUCE+VSTACKが遅い理由と解決策
HSTACKは速い?遅い?実際に試してみた結果
条件付きMEDIAN関数を作る|LAMBDA関数で汎用〇〇IFSを実現
複数列の直積(デカルト積、クロスジョイン)
フィボナッチ、トリボナッチ、テトラナッチ数列を1数式で作成
表データから複数条件による複合抽出 (横AND/縦OR)
配列を自在に回転させる数式
掛け算(*)を使わない掛け算|足し算(+)を使わない足し算


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

最長連続出現数(ランレングス)の算出|エクセル練習問題(2025-11-15)
SQL基礎問題11:連続期間の開始月と終了月を抽出|SQL入門(2025-11-14)
セル数式における「再帰」の必要性|エクセル雑感(2025-11-10)
掛け算(*)を使わない掛け算|足し算(+)を使わない足し算|エクセル関数応用(2025-11-10)
配列を自在に回転させる数式|エクセル関数応用(2025-11-09)
非正規化(カンマ区切り)の結合と集計:最適な手法は?|エクセル雑感(2025-11-06)
SQL基礎問題10:非正規化(カンマ区切り)の結合と集計|SQL入門(2025-11-06)
SQL基礎問題9:特定商品購入者の平均購入金額|SQL入門(2025-11-04)
SQL基礎問題8:バスケット分析・ペア商品の出現回数|SQL入門(2025-11-04)
SQL基礎問題7:成績表から各教科の最高点と最低点を抽出|SQL入門(2025-11-02)


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

1.生成AIパスポート試験 練習問題(四肢択一式)|生成AI活用研究
2.最終行の取得(End,Rows.Count)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.RangeとCellsの使い方|VBA入門
7.FILTER関数(範囲をフィルター処理)|エクセル入門
8.日本の祝日一覧|Excelリファレンス
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.セルのクリア(Clear,ClearContents)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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