GESP 六级 · GESP 202509 C++ 六级 第 10 题

选择题 · 答案 B · 考点:格雷码

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

题目

下面代码生成格雷编码。则横线上应填写( )。

vector<string> grayCode(int n) {
    if (n == 0) return {"0"};
    if (n == 1) return {"0", "1"};

    vector<string> prev = grayCode(n-1);
    vector<string> result;
    for (string s : prev) {
        result.push_back("0" + s);
    }
    for (___________) { // 在此处填写代码
        result.push_back("1" + prev[i]);
    }
    return result;
}
答案:B

考点

格雷码

解题思维

根据上下文和C++语法规则确定空缺处应填的内容,关注函数调用参数、表达式和返回值类型。

常见错误

填空时注意语法完整性:分号、括号匹配、函数参数类型和个数、返回值类型。

详细解析(节选)

【考点】递归构造|格雷码性质|反向遍历

1. 考纲定位 本题定位在 GESP C++ 六级递归模块,命题人刻意考察对格雷码构造规则的理解。绝大多数考生能写出递归框架,但会忽略"后半段需反转"这一关键性质,导致生成错误序列。

2. 解题思维 格雷码的核心是相邻两码仅差一位。前半段在原有码前加'0',顺序不变;后半段必须在原有码前加'1',为保持相邻性质,后半段必须按原序列的逆序处理。因此横线处必须遍历 prev 的反向序列,从后往前取元素。

3. 陷阱拆解 选项 A 按顺序遍历 prev,导致后半段生成的码与原码顺序一致,破坏了格雷码"相邻仅差一位"的性质;选项 C 是范围 for 循环,无法使用索引 i 访问元素;选项 D 的 size()/2 毫无逻辑。题目最阴险之处在于不直接提示"反转",而是要求考生根据格雷码性质自行推导。

4. 反命题思维 若题目要求生成前半段格雷码,横线应填 A;要求后半段则填 B;要求第 n 个格雷码则需输出 prev[n]。刷到此类递归构造题,先问自己"该步骤是否改变了遍历顺序"。

同考点真题

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