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

选择题 · 答案 C · 考点:递归函数、函数、递推

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

题目

给定如下函数(函数功能同上题,增加输出打印):

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$ 时,屏幕上输出序列为( )。

答案:C

考点

递归函数函数递推

解题思维

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

常见错误

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

详细解析(节选)

【考点】递归函数|函数调用栈|递推关系

考纲定位:本题位于 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 处,序列会完全不同。遇到此类题先问自己"谁先被调用、谁先输出"。

同考点真题

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