下面代码生成格雷编码。则横线上应填写( )。
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;
}根据上下文和C++语法规则确定空缺处应填的内容,关注函数调用参数、表达式和返回值类型。
填空时注意语法完整性:分号、括号匹配、函数参数类型和个数、返回值类型。
【考点】递归构造|格雷码性质|反向遍历
1. 考纲定位 本题定位在 GESP C++ 六级递归模块,命题人刻意考察对格雷码构造规则的理解。绝大多数考生能写出递归框架,但会忽略"后半段需反转"这一关键性质,导致生成错误序列。
2. 解题思维 格雷码的核心是相邻两码仅差一位。前半段在原有码前加'0',顺序不变;后半段必须在原有码前加'1',为保持相邻性质,后半段必须按原序列的逆序处理。因此横线处必须遍历 prev 的反向序列,从后往前取元素。
3. 陷阱拆解 选项 A 按顺序遍历 prev,导致后半段生成的码与原码顺序一致,破坏了格雷码"相邻仅差一位"的性质;选项 C 是范围 for 循环,无法使用索引 i 访问元素;选项 D 的 size()/2 毫无逻辑。题目最阴险之处在于不直接提示"反转",而是要求考生根据格雷码性质自行推导。
4. 反命题思维 若题目要求生成前半段格雷码,横线应填 A;要求后半段则填 B;要求第 n 个格雷码则需输出 prev[n]。刷到此类递归构造题,先问自己"该步骤是否改变了遍历顺序"。