递归与迭代
了解何时选择各自的方式。
递归与迭代 是 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 反馈 — 无需本地设置。