再帰の可視化

再帰的なC++関数が自分自身を呼び出す様子をステップごとに確認します。階乗のコールスタックとフィボナッチのコールツリーを表示します。

すべてこのブラウザ内でシミュレートされ、サーバーには一切送信されません。

factorial(4)が呼び出される

呼び出し回数:1 · factorial(4) = 24

factorial(4)が呼び出される

コールスタック

factorial(4)?
  • 実行中
  • 待機中
  • 解決済み

ステップ 1 / 16

コード

#include <iostream>
using namespace std;
long factorial(int n) { // n! を再帰的に計算します
if (n == 0) return 1; // 基底ケース: 0! は 1 で、以降の呼び出しはありません
long r = n * factorial(n - 1); // 再帰ケース: n - 1 で呼び出し、乗算します
return r; // 結果を呼び出し元に返します
}
int main() {
int n = 4; // これはスライダーの値です
long resultado = factorial(n); // main からの最初の呼び出し
cout << resultado << endl; // 最終結果
return 0;
}

このツールは、C++の定番の2つの例で、再帰を視覚的に解説します。階乗ではコールスタックを表示し、factorial(n) の呼び出しがベースケースに達するまでフレームとして積まれ、その後1つずつ値を呼び出し元に返しながら解消されていく様子が分かります。フィボナッチでは呼び出しツリーを表示し、fib(n) が枝分かれしていく様子と重複する計算が確認できます。実行中のC++コード行が強調されます。処理はブラウザー内で行われます。

使い方

  1. 見たい例に応じて、「階乗」または「フィボナッチ」のタブを選びます。
  2. スライダーでnを調整します。アニメーションは最初のステップに戻ります。
  3. 「再生」を押すか、前へ・次へのボタンで進め、必要なら速度を変更します。
  4. コールスタックまたは呼び出しツリー、呼び出し回数のカウンター、強調されるC++コードの行を確認します。

よくある質問

再帰とは何ですか?
関数が自分自身を、より小さな問題に対して呼び出し、直接解ける場合にたどり着いたら、結果をまとめていく手法です。
ベースケースとは何ですか?
呼び出しを止める条件です。階乗では n が0のとき1を返し、フィボナッチでは n が2未満のとき n を返します。ベースケースがないと、再帰は終わりません。
コールスタックとは何ですか?
実行中のすべての呼び出しをプログラムが保持する構造です。呼び出されるたびに積まれ、値を返すと取り除かれます。順序はLIFOです。
再帰版のフィボナッチで計算が重複するのはなぜですか?
fib(n) が fib(n-1) と fib(n-2) を呼び出し、それらが同じ値を何度も計算し直すためです。ツリーが急速に大きくなり、重複した呼び出しが強調されます。

関連ツール