GESP 七级 · GESP 202509 C++ 七级 第 11 题

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

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

题目

下面程序的输出为( )。

#include <iostream>
using namespace std;
int fib(int n) {
    if (n == 0)
        return 1;
    return fib(n - 1) + fib(n - 2);
}
int main() {
    cout << fib(6) << endl;
    return 0;
}
答案:D

考点

递归函数

解题思维

模拟程序执行过程,逐行跟踪变量变化,特别关注循环边界和递归终止条件。

常见错误

模拟执行时注意:① 循环变量的起始和终止值;② 递归的边界条件;③ 数据类型转换和精度问题。

详细解析(节选)

【考点】递归函数|基值条件判断|栈溢出

🎯 考纲定位 GESP 七级「算法基础—递归」模块。命题人专门用这道题卡住那些以为"递归题就是把问题拆小"就万事大吉的考生——七级明确要求理解递归终止条件,但很多孩子只盯着 n>0 的情况,完全没意识到 n 会走到负数。

🧠 解题思维 这题必须完整走一遍调用链才能看清真相:fib(6) 会层层递归到 fib(0) 返回 1,但 fib(1) 会同时调用 fib(0) 和 fib(-1);fib(-1) 没有命中 n==0,继续调 fib(-2) 和 fib(-3)……负数路径永远碰不到终止条件,栈无限增长。关键观察点在于:递归函数不仅要有 n==0 的出口,还要考虑所有可能的输入域,不能默认参数只会变小。

🪤 陷阱拆解 选项 D 是唯一的正确选项,其他三个数字都是干扰项。命题人最阴险的陷阱是"看似正常的递归"——函数体里确实有返回语句,确实会减小参数,但参数减小到负数后就没法继续减小了,这是递归必杀技:必须覆盖所有终止情形。如果你只背"递归要减小参数"这个结论,就会掉进陷阱,以为只要 n 在变小就安全了。

🔄 反命题思维 如果题目把 n==0 改成 n<=0,答案就变成 13(正常斐波那契数列)。如果改成 return n==0?1:n==1?1:fib(n-1)+fib(n-2),则 fib(6) 输出 8。这类题刷到的时候先问自己:"这个递归的终止条件到底覆盖了哪些 n?有没有漏掉一个永远进不去的分支?"

同考点真题

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