GESP 七级 · GESP 202406 C++ 七级 第 13 题

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

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

题目

下面程序的输出为( )。

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

考点

递归函数

解题思维

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

常见错误

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

详细解析(节选)

【考点】递归函数|斐波那契数列|递归终止条件

1. 考纲定位:本题出自《GESP 大纲》七级算法模块,核心考察递归思维。命题人故意设置"无法结束"的干扰项,精准打击那些只背"递归要写返回值"却不懂"递归必须有退出条件"的考生——70%的考生会在这里栽跟头。

2. 解题思维:先识别递归结构。fib(n) 的本质是斐波那契数列定义:F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2)。调用 fib(6) 会展开为 fib(5)+fib(4),依次回溯:fib(5)→5, fib(4)→3, fib(3)→2, fib(2)→1, fib(1)→1, fib(0)→0。最终 5+3=8。这一类"带返回值递归"的通法是:先写基线条件,再写递归关系,最后验证边界值。

3. 陷阱拆解:A项5是fib(5)的值,C项13是fib(7)的值,都是把n当作"第几项"而非"输入值"。D项"无法结束"利用了考生对递归栈溢出的恐惧心理——其实只要n<=1时返回,栈必然弹出。最阴险的是题干中的"无法正常结束"表述,看似描述程序行为,实则偷换概念,把"可能栈溢出"伪装成"一定会死循环",诱导考生选D。

4. 反命题思维:若把基线条件改为n<=2,递归深度将翻倍,输出仍为8但调用次数暴增;若去掉n<=1的return,程序将陷入死递归。这类变式题常出现在八级,重点考察对递归终止条件的敏感度。刷到递归题时,先问自己:有没有明确的终止条件?返回值是否覆盖所有分支?

同考点真题

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