{}const=>[]async()letfn</>var
概要開発基礎

再帰を理解する:プログラミングで最も神秘的なテーマの1つがどのように機能するか

再帰について混乱していて、それがどのように機能するのか理解できませんか?階乗の例を使い、ステップバイステップの分析で、簡単な言葉で説明します。魔法は使わず、論理だけで解説します!

К

Kodik

著者

1分で読める

もしあなたも再帰関数を見て、鏡の中に無限に映っているような感覚を覚えたことがあるなら、ようこそ!この記事はあなたのためのものです。今日は再帰を分類していきます。シンプルで楽しく、わかりやすく、たくさんの例をあげていきます。さあ始めましょう!🚀


🔎 人間の言葉で言うと、再帰とは何ですか?

再帰とは、関数がそれ自体を呼び出すことです(慌てないでください!)。これは、問題を小さなサブタスクに分割して解決するために必要です。これは、いわゆる「固定点」に達するまで繰り返されます。 ベースケース - 停車地点。

🎭 2つの鏡の間に無限の反射があると想像してみてください。あなた、そして少し小さなあなた、そして非常に小さなあなた、そしてその先へ。それが再帰です。ただし、反射の代わりに関数の呼び出しです。さらに、これらの呼び出しはそれぞれ、前の呼び出しよりも少し簡単になり、最後は、誰でも対応できるものになります(つまり、誰でも使える関数です!)。

📦 または別の例:箱の中に箱を想像してみてください。その中に別の箱があり、最後の最小の箱に到達するまで続きます。プログラミングでは、この最後の箱が基本ケースです。以上です。これ以上「解凍」するものはありません。結果をまとめる時です。


🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加

📌 例1:階乗は再帰のお気に入り

階乗 数字 nn!で表される)は、1からnまでのすべての数字の積です。

例:

5! = 5 × 4 × 3 × 2 × 1 = 120

Pythonでの再帰実装:

def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n - 1)

各呼び出しは、1または0に達するまでnを減らし、関数は結果を返し始めます。階段を降りて階段を上るのとよく似ています。


📌例2:nまでの数の合計

それでは、1からnまでのすべての数字を足しましょう。

def sum_to(n):
    if n == 1:
        return 1
    else:
        return n + sum_to(n - 1)

sum_to(5) を呼び出す:

sum_to(5)
= 5 + sum_to(4)
= 5 + (4 + sum_to(3))
= 5 + (4 + (3 + sum_to(2)))
= 5 + (4 + (3 + (2 + sum_to(1))))
= 5 + 4 + 3 + 2 + 1 = 15

これが再帰の魔法です。タスクは理解しやすいものに「縮小」され、次に応答に「折りたたまれます」。


📌 例3:カウントダウン(と便利なスキル)

def countdown(n):
    if n == 0:
        print("Let's go!")
    else:
        print(n)
        countdown(n - 1)

countdown(5) を起動すると、次のようになります。

5
4
3
2
1
Поехали!

再帰は常に値を返す必要はありません。単にアクションを実行することもできます。これは、それを適用し始めるのに最適な方法です。


🧨 ほとんどの人が犯す間違い(そしてそれらを避ける方法)

  1. 基本的なケースを忘れました - そして、無限の再帰にこんにちは。関数が停止する必要がある場所を確認してください。

  2. 条件が正しくありません たとえば、n <= 0の代わりにif n == 0を使用すると、再び無限大になります。

  3. 再帰は、再帰なしの方が簡単な場合に — いつも自問してください:「ここでは本当に再帰が必要ですか?」


🌟 本当に再帰が役に立つとき

再帰は次の場合に便利です。

  • 回避する必要があります ネストされた構造、たとえば、フォルダまたはJSON。

  • 課題 自然に分割されます 部分的に(例えば、並べ替え、検索ツリー)。

  • 試してみる必要がある すべてのルート - パズル(迷路、数独など)の解決策を探すのに最適です。


📈 再帰の欠点(慌てないで、知っておいてください)

  • 各再帰呼び出しは追加のメモリ(呼び出しスタック)です。

  • 多くのレベル→スタックがいっぱいになります(特にPythonで)。

  • 最適化しない場合、通常のサイクルよりも動作が遅くなります。


✨ 再帰と永遠に友達になる方法

  1. ✏️ 描画 — 呼び出しツリー、スタック、アクションシーケンス。

  2. 🎮 練習してください - 最も単純なものであっても、計算を解きましょう。階乗、合計、逆順の文字列など。

  3. 🔍 進捗状況を確認する — ステップバイステップ、print() またはデバッガーで。

  4. 🧪 サイクルと比較 — 長所と短所を確認するために、両方のバージョンを書いてください。


🧪 例4:文字列の反転

def reverse_string(s):
    if len(s) == 0:
        return ""
    return s[-1] + reverse_string(s[:-1])

reverse_string("Code")"kidoK"

このように、行を美しく、わかりやすく反転させることができます。


🎬 まとめ

再帰とは:

  • タスクを簡単なステップに分割する方法。

  • 基本条件に達するまでに自身を呼び出す関数。

  • 手懐けることができる魔法。

まだ完全に理解していない場合は、記事をもう一度読んでください。これも再帰です😉

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要