下面代码采用递推算法来计算斐波那契数列 $f(n) = f(n-1) + f(n-2)$,则横线上应填写( )。
int fib(int n) {
if (n == 0 || n == 1)
return n;
int f1 = 0;
int f2 = 1;
int result = 0;
for (int i = 2; i <= n; i++) {
// 在此处填入代码
}
return result;
}A.
result = f1 + f2;
f1 = f2;
f2 = result;B.
result += f1 + f2;
f1 = f2;
f2 = result;C.
result += f1 + f2;
f2 = result;
f1 = f2;D.
result = f1 + f2;
f2 = result;
f1 = f2;答案A。代码补全要考虑参数传递方式。如果需要修改实参,需用指针(*)传递。排序算法要理解每步比较的含义。
排序代码补全要理解每步比较的含义。选择排序找最小值时比较的是array[min]>array[j]。
本题考查的是《GESP 考试大纲》四级算法模块中的递推(迭代)知识点。命题人把这道题放在这里,是因为它精准卡住了绝大多数考生的一个致命弱点:分不清循环中哪个变量是"新结果"、哪个是"待用旧值"。几乎所有同学都会把 result 当成最终答案,却忘了它在循环里是"递推中间量"。
看到题先想:斐波那契是 f(i) = f(i-1) + f(i-2)。循环里 i 从 2 开始,此时 f1 存的是 f(i-2),f2 存的是 f(i-1)。要算 f(i),先让 result = f1 + f2 得到新值,但 f1 和 f2 还得继续往后用,所以必须先保留旧 f2 才能让 f1 继承,再让 f2 继承新 result。通法:任何需要保存前两个状态并迭代的递推问题,都是先算新值,再按 f1 ← f2、f2 ← result 的顺序向后赋值。