GESP 四级 · GESP 202506 C++ 四级 第 21 题

判断题 · 答案 B · 考点:循环控制、递推

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

题目

以下程序中使用了递推方式计算阶乘($n! = 1 \times 2 \times \ldots \times n$),计算结果正确。

int factorial(int n) {
    int res = 1;
    for (int i = 0; i < n; ++i) {
        res *= i;
    }
    return res;
}
答案:B

考点

循环控制递推

解题思维

答案B。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。

常见错误

指针和数组追踪时画内存布局图可以大大简化理解。

详细解析(节选)

【考点】循环控制|递推逻辑|for循环变量初始化

本題考 GESP C++四级「循环控制」与「递推逻辑」,命题人专盯初学者「以为循环变量从1开始就能算阶乘」的惯性思维,用for循环初始值为0的坑卡住90%考生。

看到for循环先盯i的起始值:i=0意味着第一次乘法就是res*=0,任何正数乘0都得0,后续循环再乘什么都是0。递推的本质是从1累乘到n,起始值必须为1,否则整个递推链被0摧毁。

选A的同学死在没看i的初始值——以为循环里只要乘数从1开始就行,却忽略了for循环的i从0起步,第一次乘法就直接把res清零。递推公式n!=1×2×...×n里,第一个乘数必须是1,代码里res初始为1是对的,但循环变量i必须从1开始,否则递推链在第一步就断了。

若把i改成1,题目就变成考「循环变量应等于乘数」;若改成for(i=0;i<=n;i++)res*=i+1;,则考边界条件与递推对应关系。刷到这类题先问自己:「循环变量在乘法里扮演什么角色?」

同考点真题

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