给定如下函数(函数功能同上题,增加输出打印):
int fun(int n) {
cout << n << " ";
if (n == 1) return 1;
if (n == 2) return 2;
return fun(n - 2) - fun(n - 1);
}则当 $n = 4$ 时,屏幕上输出序列为( )。
仔细审题,明确已知条件和所求目标,运用相关知识点逐项分析。
审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。
【考点】递归函数|函数调用栈|递推关系
考纲定位:本题位于 GESP 五级"递归与函数"模块,专门卡住考生对递归执行顺序的盲区。命题人故意把输出放在递归入口处,迫使你按调用栈展开顺序追踪,而非凭直觉猜数字大小。
解题思维:模拟 n=4 的递归展开——先输出 4,再调 fun(2) 输出 2,接着调 fun(3) 输出 3;fun(3) 内部又调 fun(1) 输出 1、fun(2) 输出 2,最终序列为 4 2 3 1 2。递归本质是"先调用再返回",输出时机决定顺序。
陷阱拆解:A 把递归当成递增序列,误以为 fun(n) 的输出是 n-1 等,但实际是输出 n 本身,然后递归;B 误以为输出按 n 值排序,忽略了深度优先的调用顺序;D 故意多塞一个 1 来混淆"fun(1) 只输出一次"的直觉。命题人利用"输出在递归入口处"这一细节,让只背结论的人把顺序搞反。
反命题思维:若把递归顺序改为先 n-1 后 n-2,或把输出移到 return 处,序列会完全不同。遇到此类题先问自己"谁先被调用、谁先输出"。