执行 climb(6) 的返回值为( )。
int climb(int n){
if(n <= 2) return n;
int a = 1, b = 2, c = 0;
for(int i = 3; i <= n; i++){
c = a + b;
a = b;
b = c;
}
return c;
}答案B。>=是大于等于比较运算符,>>=是右移赋值运算符(a>>=3等价于a=a>>3)。两者都是合法的C++运算符。
>=是右移赋值运算符,不是比较运算符。a>>=3相当于a=a>>3,将a右移3位。
【考点】循环结构|递推数列|模拟计算
解题思维:看到 climb(n) 先想“这是递推”,因为 n<=2 直接返回,循环里用 a b 存前两项,c = a + b 求和再更新 a b。代入 n=6 一步步模拟:i=3 时 c=3,a=2,b=3;i=4 时 c=5,a=3,b=5;i=5 时 c=8,a=5,b=8;i=6 时 c=13,a=8,b=13,循环结束返回 c 即 13。这类题通法是“识别递推关系 + 手动模拟循环变量”,尤其注意循环次数(i 从 3 到 n 共 n-2 次)和返回值(是 c 不是 b)。
陷阱拆解:选 A 8 的常见误区是只记斐波那契数列 0,1,1,2,3,5,8 却忘了本题初始 a=1,b=2,导致同项错位;选 C 5 或 D 10 多半是循环次数算错(把 i<=n 当成 i<n 或 i<n-1),或者误以为 c 是累加和而非最新项。最阴险的是“返回值 c"这行——很多人以为循环结束时 b 才是结果,其实 c 已经更新了最后一次求和,直接 return c 才是答案。只背结论不模拟,必掉坑。
反命题思维:若把初始化改成 a=0,b=1,则 climb(6) 会变成 8;若循环条件改为 i<n,则返回 8;若加取模 c = (a+b)%10,序列会循环。刷到类似题先问“循环跑了多少次?”“最后 return 的是哪个变量?”“初始值是否和经典递推一致?”——这三问能瞬间定位命题人想考你的点。