GESP 五级 · GESP 202406 C++ 五级 第 14 题

选择题 · 答案 D · 考点:函数与递归

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

题目

给定如下函数:

int fun(int n) {
    if (n == 1) return 1;
    if (n == 2) return 2;
    return fun(n - 2) - fun(n - 1);
}

则当 $n = 7$ 时,函数返回值为( )。

答案:D

考点

函数与递归

解题思维

仔细审题,明确已知条件和所求目标,运用相关知识点逐项分析。

常见错误

审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。

详细解析(节选)

【考点】递归|递归终止条件

考纲定位:递归(高级编程模块·递归与递推),命题人利用的是考生对递归返回值和终止条件的混淆,以及手算递归时容易出现的符号错误。该题卡住了绝大多数考生的"递归展开手算"弱点,因为递归式中有减号,容易在展开时符号混乱。

解题思维:看到递归函数先锁定终止条件 n=1 和 n=2,再展开递归式。本题 n=7 时展开为 fun(5)-fun(6),继续展开:fun(5)=fun(3)-fun(4),fun(6)=fun(4)-fun(5),于是 fun(7)=fun(3)-2fun(4)+fun(5)。继续展开至 base case:fun(3)=fun(1)-fun(2)=1-2=-1,fun(4)=fun(2)-fun(3)=2-(-1)=3,fun(5)=fun(3)-fun(4)=-1-3=-4,代入得 fun(7)=-1-2×3+(-4)=-11。通法:递归题先写终止条件,再写递归关系,从大往小或从小往大展开,注意符号和顺序。手动计算 n=1~6 的值可验证:fun(1)=1, fun(2)=2, fun(3)=-1, fun(4)=3, fun(5)=-4, fun(6)=7,代入递归式得 fun(7)=fun(5)-fun(6)=-4-7=-11。

陷阱拆解:A 项 0 来自把减号看成加号后抵消,B 项 1 来自只算 fun(n-1) 忽略 fun(n-2),C 项 21 来自符号全错且误用斐波那契递推,D 项 -11 是正确答案。最阴险细节是递归式中的减号容易被忽略,如果你只背结论、不理解本质,就会掉进这个陷阱。C 项 21 是典型"递归误用斐波那契"陷阱,命题人故意把减号放在递归式里,让考生用加法习惯去解。

反命题思维:若改为 fun(n)=fun(n-2)+fun(n-1) 则答案为 13,若交换两项顺序则符号全反,若将递归式改为 fun(n)=fun(n-2)-fun(n-1)+1,则 n=7 的答案会变成 -10。一句话提醒:刷到类似题时,先问自己"命题人想考我什么",尤其是符号和顺序。

同考点真题

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