0Pricing
Zig Academy · 课时

递归与多返回值

编写能够调用自身并分支执行的函数。

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

函数调用自身

递归是指函数通过调用自身,逐步解决同一问题中规模更小的部分。🔁

每次递归都需要基本情况

基本情况就是停止点。如果没有它,函数会无限调用自身,最终导致栈溢出。

递归情况

递归情况会使用更小的输入再次调用函数,不断向基本情况靠近。

fn factorial(n: u64) u64 {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

跟踪一次简单调用

调用 factorial(3) 会变成 3 * factorial(2),然后变成 2 * factorial(1)。基本情况返回 1,结果再逐层相乘返回。

递归使用栈

每次调用都会向栈中添加一个栈帧。层数过多会导致栈溢出,因此请将递归深度控制在合理范围内。

许多问题也可以使用循环

任何递归逻辑都可以改写成循环。循环不需要额外的栈帧,因此通常是更安全的选择。

fn factorial(n: u64) u64 {
    var acc: u64 = 1;
    var i: u64 = 2;
    while (i <= n) : (i += 1) acc *= i;
    return acc;
}

函数只有一种返回类型

Zig 函数只有一个返回类型,但可以包含多条 return 语句,并且它们都产生该类型的值。

提前返回会产生不同分支

您可以从不同分支提前返回。每条路径都会返回声明类型的值,并立即退出函数。

fn sign(n: i32) i32 {
    if (n > 0) return 1;
    if (n < 0) return -1;
    return 0;
}

使用结构体返回多个值

要返回多个值,请返回一个结构体或元组,将这些值组合成一个结果。

fn divmod(a: u32, b: u32) struct { q: u32, r: u32 } {
    return .{ .q = a / b, .r = a % b };
}

拆解结果

调用方可以通过名称读取组合结果中的字段,例如 result.q 和 result.r,从而分别使用返回的各个部分。

const res = divmod(7, 2);
// res.q is 3, res.r is 1

也可以返回错误

函数可以返回错误联合类型,这样某个分支可以表示失败,而其他分支仍能返回普通值。

快速检查

您编写了一个递归函数,但它从不停止并最终崩溃。您最可能忘记了什么?

回顾

递归需要一个基本情况以及一次规模更小的递归调用。函数只有一种返回类型,但可以有多条返回路径;结构体可以组合多个结果。🎯

常见问题解答

「递归与多返回值」课时是免费的吗?

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

「递归与多返回值」这节课中我会学到什么?

编写能够调用自身并分支执行的函数。 你通过在浏览器中直接运行的动手代码来练习 Zig Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Zig Academy 需要有经验吗?

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

「递归与多返回值」课时需要多长时间?

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

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

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

此课程中的所有课时

  1. 函数语法与返回类型
  2. 传递值与传递引用
  3. pub 函数与可见性
  4. 递归与多返回值
← 返回 Zig Academy