给定如下函数:
int fun(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
return fun(n - 2) - fun(n - 1);
}则当 $n = 7$ 时,函数返回值为( )。
仔细审题,明确已知条件和所求目标,运用相关知识点逐项分析。
审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。
【考点】递归|递归终止条件
考纲定位:递归(高级编程模块·递归与递推),命题人利用的是考生对递归返回值和终止条件的混淆,以及手算递归时容易出现的符号错误。该题卡住了绝大多数考生的"递归展开手算"弱点,因为递归式中有减号,容易在展开时符号混乱。
解题思维:看到递归函数先锁定终止条件 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。一句话提醒:刷到类似题时,先问自己"命题人想考我什么",尤其是符号和顺序。