1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
  6. test 6
コース一覧
アルゴリズム道場 カメ師範の十の巻
第六の巻 再帰

アルゴリズム道場 カメ師範の十の巻

言語を問わず、考え方だけを問う演習専用コースです。解説はありません。巻物と完成条件だけを読み、白紙から自分で組み立てます。Python・JavaScript・TypeScript・Java のどれで解いても構いません。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。総和と最大から始まり、線形探索、整列、二分探索、再帰、スタックとキューを経て、最後は初見の疑似コードを読み解いて実装するところまで、10問でアルゴリズムの基礎を一巡します。1問15分から45分、全10問で約5時間です。いずれかの言語の入門を終えて「動くものは書けるが、考え方に自信がない」と感じている方に向いています。

1
初段
01. 第一の巻 総和と最大15分
02. 第二の巻 線形探索15分
03. 第三の巻 バブルソート20分
04. 第四の巻 二分探索25分
2
中段
01. 第五の巻 整列の途中経過25分
02. 第六の巻 再帰25分
03. 第七の巻 スタックを作れ30分
04. 第八の巻 キューを作れ30分
3
師範
01. 第九の巻 計算量を体感せよ35分
02. 免許皆伝 初見の巻物45分

第六の巻 再帰

中段 / 目安 25分

カメ師範が六本目の巻物を解きました。中には、木の枝のような図が一枚だけ描かれています。

「自分を呼ぶ関数を書け。階乗、そしてフィボナッチ。呼び出しの連なりを紙に描いてから書くのじゃ」

師範は湯呑みを置いて続けます。「ループは、上から下へ一本道じゃ。再帰は違う。自分より小さい問題を、もう一人の自分に任せる。任せた先が答えを持って帰ってくるのを信じて待つ。信じられぬ者は、この技を使えぬ」

この巻の掟は一つです。ループを書いてはなりません。for も while も使わず、関数が自分自身を呼ぶ形だけで組み立ててください。

再帰で最初に決めるのは、進む道ではなく止まる場所です。止まる条件を書き忘れた再帰は、自分を無限に呼び続けて力尽きます。階乗なら「0の階乗は1」、フィボナッチなら「0番目は0、1番目は1」。ここが地面です。地面を先に置いてから、その上に「自分より小さい自分に任せる」一行を乗せます。

完成条件

factorialAndFib という関数を1つ定義してください。どの言語で解いても関数名は factorialAndFib にしてください。Python でも snake_case ではなく、この綴りのまま使います。

引数は2つです。n は階乗を求める数、m はフィボナッチの番号です。返すのは次の形をした1つの文字列です。

プレーンテキスト

5! = 120 / fib(10) = 55

数の前後の空白と、区切りの / の形を、この見本のとおりに揃えてください。

階乗とフィボナッチの決まりは次のとおりです。

  • 階乗は、0 の階乗が 1、それ以外は n かける (n-1) の階乗
  • フィボナッチは、0番目が 0、1番目が 1、それ以外は直前2つの和

階乗とフィボナッチはそれぞれ別の補助関数に切り出し、factorialAndFib はその2つを呼んで文字列を組み立てるだけにしてください。1つの関数に詰め込むと、どちらの再帰が壊れているのか分からなくなります。

フィボナッチの素朴な再帰は、番号が大きくなると呼び出しが爆発的に増えます。この巻では m は 25 までしか渡しません。

進め方

白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

開かずに10分粘って進まないなら、①だけ開けてください。粘る時間そのものには価値がありません。価値があるのは、自分で書いた行が動いた瞬間です。

書く前に、紙に fib(5) の呼び出しを枝分かれで描いてみてください。fib(5) が fib(4) と fib(3) を呼び、その fib(4) がまた fib(3) と fib(2) を呼ぶ。同じ枝が何度も現れることに気づけば、この技の速さと遅さの両方が一度に見えます。

要件

  1. 関数名は4言語すべてで factorialAndFib にすること(Python も snake_case にしない)
  2. 引数は n(階乗を求める数)と m(フィボナッチの番号)の2つ
  3. for も while も使わず、関数が自分自身を呼ぶ再帰だけで組み立てること
  4. 階乗は0の階乗が1、それ以外は n かける (n-1) の階乗
  5. フィボナッチは0番目が0、1番目が1、それ以外は直前2つの和
  6. 階乗とフィボナッチはそれぞれ別の補助関数に切り出すこと
  7. 戻り値は「5! = 120 / fib(10) = 55」の形をした1つの文字列であること
  8. 数の前後の空白と区切りの半角スラッシュの位置を見本どおりに揃えること

入出力例

factorialAndFib(5, 10) → "5! = 120 / fib(10) = 55" factorialAndFib(0, 0) → "0! = 1 / fib(0) = 0" factorialAndFib(1, 1) → "1! = 1 / fib(1) = 1" factorialAndFib(7, 15) → "7! = 5040 / fib(15) = 610" factorialAndFib(10, 25) → "10! = 3628800 / fib(25) = 75025" factorialAndFib(3, 20) → "3! = 6 / fib(20) = 6765"

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

①方針 先に止まる条件だけを書いた関数を2つ作ります。階乗は n が0のとき1を返して終わり、フィボナッチは番号が0のとき0、1のとき1を返して終わりです。ここまで書いてから、その下に自分を呼ぶ一行を足します

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/09

関連レッスン

  • 第七の巻 スタックを作れ

    後から入れたものが先に出る器を、配列だけで作ります。

  • 第八の巻 キューを作れ

    先に並んだ者が先に出る器を作ります。スタックとの違いを言葉にします。

  • 第九の巻 計算量を体感せよ

    同じ答えを出す2つのやり方で、比べた回数がどれだけ違うかを数えます。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 関数処理に名前を付けて再利用できる単位
  • ループ繰り返し処理。矢印で戻すか専用記号で示す
  • 再帰関数が自分自身を呼び出す処理パターン
  • 引数位置引数=順番で渡す。
  • 戻り値呼び出し元への返答を表す点線矢印
main.py
学習モード
エディタを読み込んでいます

メモ

第六の巻 再帰

⌘S で保存