0Pricing
C Academy · 课时

递归与迭代

了解何时选择各自的方式。

递归与迭代 是 CoddyKit 上的免费 C Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C Academy 课程共包含 4 节课。

两种重复方式

许多问题既可以用递归解决,也可以用迭代解决。迭代使用循环,递归使用函数调用。

两者都能产生相同的结果,但在编写风格、内存占用和速度方面有所不同。

使用循环计算阶乘

下面是用循环以迭代方式编写的阶乘。函数不会调用自身;单个变量会累积乘积。

#include <stdio.h>

long factorial(int n) {
    long result = 1;
    for (int i = 2; i <= n; i++)
        result *= i;
    return result;
}

int main(void) {
    printf("%ld\n", factorial(6));
    return 0;
}

使用递归计算阶乘

递归版本更短,并且直接对应数学定义。

计算 factorial(6) 时,两种版本都会输出 720,但使用的机制不同。

long factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

内存占用差异

迭代通常只使用固定且少量的内存:几个局部变量就足够了。

递归会为每次调用增加一个栈帧,因此深度递归会使用更多内存,并可能耗尽栈空间。

速度差异

每次递归调用都会产生少量开销:需要建立一个栈帧,并在之后从中返回。

对于简单的计数任务,循环通常会稍快一些,因为它避免了这种调用开销。

递归更有优势的情况

当问题本身具有递归结构时,递归就很有优势,例如处理树、嵌套结构或分治算法。

在这些情况下,递归代码比使用手动栈实现的等价循环更短、更清晰。

迭代更有优势的情况

对于求数组总和或计数这类简单的线性重复,循环更简单,并且只使用固定大小的内存。

它还避免了大规模输入导致栈溢出的风险。

int sum_array(int a[], int n) {
    int total = 0;
    for (int i = 0; i < n; i++)
        total += a[i];
    return total;
}

同一任务的两种写法

从 1 加到 n 可以用两种方式完成。下面是迭代版本,它会返回与递归相同的结果。

#include <stdio.h>

int sum_to(int n) {
    int total = 0;
    for (int i = 1; i <= n; i++)
        total += i;
    return total;
}

int main(void) {
    printf("%d\n", sum_to(100));
    return 0;
}

将递归转换为循环

任何递归都可以改写为迭代,有时需要使用您自己显式管理的栈。

简单的线性递归(例如阶乘或求和)可以转换为使用累加器变量的普通循环。

#include <stdio.h>

int main(void) {
    int n = 5, result = 1;
    while (n > 1) { result *= n; n--; }
    printf("%d\n", result);
    return 0;
}

尾递归说明

尾递归调用是函数执行的最后一个动作。有些编译器会将其优化为循环,并重用同一个栈帧。

C 不保证进行这种优化,因此不要依赖它来实现深度递归。

int sum_tail(int n, int acc) {
    if (n == 0) return acc;
    return sum_tail(n - 1, acc + n);
}

选择方法

请思考:这个问题是否天然具有嵌套结构或分治结构?如果是,递归就很合适。

如果只是简单的线性重复,而且输入可能非常大,那么迭代更安全,通常也更快。

快速检查

比较这两种方法。

回顾

递归和迭代可以解决相同的问题。循环使用固定大小的内存,非常适合线性任务;递归在处理嵌套问题和分治问题时更清晰,但每次调用都要占用一个栈帧。

常见问题解答

「递归与迭代」课时是免费的吗?

是的 — 「递归与迭代」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C Academy 课程的其余内容,请升级到 CoddyKit PRO。 C Academy 课程共包含 4 节课。

「递归与迭代」这节课中我会学到什么?

了解何时选择各自的方式。 你通过在浏览器中直接运行的动手代码来练习 C Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「递归与迭代」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C Academy 课中编写并运行代码吗?

能。每节 C Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 递归的工作原理
  2. 经典递归问题
  3. 递归与迭代
  4. 避免栈溢出
← 返回 C Academy