递归可视化

逐步演示 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++示例,直观地讲解递归。在阶乘示例中,你会看到调用栈:每次对 factorial(n) 的调用都会作为栈帧压入,直到到达基准情形,然后栈帧逐个返回,把值交还给调用者。在斐波那契示例中,你会看到调用树:每个 fib(n) 分出 fib(n-1) 和 fib(n-2),重复的调用会被高亮,说明这种递归写法为什么会做大量重复计算。你可以用滑块选择n,逐步播放动画,并跟随每一刻执行的代码行。所有内容都在浏览器中模拟。

使用方法

  1. 根据想看的示例,选择“阶乘”或“斐波那契”标签。
  2. 用滑块调整n;动画会回到第一步。
  3. 点击“播放”,或用上一步和下一步按钮前进,必要时调整速度。
  4. 观察调用栈或调用树、调用计数以及高亮的C++代码行。

常见问题

什么是递归?
一种让函数针对更小的问题调用自身的技术,直到遇到可直接求解的情形,再把结果合并起来。
什么是基准情形?
终止调用的条件:在阶乘中,n等于0时返回1;在斐波那契中,n小于2时返回n。没有基准情形,递归就永远不会结束。
什么是调用栈?
程序用来保存所有进行中调用的结构。每次调用时压入,返回值时弹出,遵循后进先出的顺序。
为什么递归版斐波那契会重复计算?
因为 fib(n) 会调用 fib(n-1) 和 fib(n-2),这些调用会多次重复计算相同的值。因此调用树增长得很快,重复调用也会被高亮。

相关工具