GESP 五级 · GESP 202512 C++ 五级 第 13 题

选择题 · 答案 A · 考点:函数与递归、时间复杂度分析

← 整套速查表 GESP 五级 全部真题

题目

下面给出了阶乘计算的两种方式。以下说法正确的是( )。

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

int factorial2(int n) {
    int acc = 1;
    while (n > 1) {
        acc = n * acc;
        n = n - 1;
    }
    return acc;
}
答案:A

考点

函数与递归时间复杂度分析

解题思维

判断正误题需注意绝对化表述("一定""必须""只能"等)往往是错误的。

常见错误

判断题中注意"一定""总是""所有""唯一"等绝对化表述通常是错误的。但也要结合具体知识点判断。

详细解析(节选)

【考点】函数与递归|时间复杂度|空间复杂度

🎯 考纲定位:GESP 五级 C++ 大纲中"函数与递归"模块必考内容。命题人专门在此处设坑,卡住的是绝大多数学生无法区分递归调用栈空间与循环局部变量空间的致命弱点——这是五级考生最容易丢分的盲区。

🧠 解题思维:factorial1 用递归,每次调用 n-1,递归深度=n,调用栈占用 O(n) 空间;factorial2 用循环,只用一个局部变量 acc,空间占用 O(1)。时间复杂度看基本操作次数:递归 n 次乘法,循环也是 n-1 次乘法,均为 O(n)。所以两种实现时间复杂度相同、空间复杂度不同。

🪤 陷阱拆解:选项 B 把循环中的 n 当成额外空间,偷换"局部变量"与"调用栈"概念;选项 C 更阴险,让学生误以为递归空间复杂度是常数,这是最典型的思维误区——只看到函数内部变量,却忽略递归调用栈的累积开销;选项 D 把递归误判为指数级,那是把递归当成分支算法(如回溯)才会犯的错误。

🔄 反命题思维:若把题目改成求 n 的幂(2^n),递归版时间复杂度是 O(n)(每次减半),而迭代版仍是 O(n),空间复杂度则变成 O(log n) vs O(1)——同样考察递归调用栈。刷到此类题先问自己:命题人想考我空间复杂度的哪个维度?

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断