以下程序中使用了递推方式计算阶乘($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。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。
指针和数组追踪时画内存布局图可以大大简化理解。
【考点】循环控制|递推逻辑|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;,则考边界条件与递推对应关系。刷到这类题先问自己:「循环变量在乘法里扮演什么角色?」