GESP 八级 · GESP 202503 C++ 八级 第 14 题

选择题 · 答案 B · 考点:递推、一维数组

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

题目

下列程序实现了输出杨辉三角形,代码中横线部分应该填入的是( )。

#include <iostream>
using namespace std;

#define N 35
int a[N];
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        a[i] = 1;
        for (int j = i - 1; j > 0; j--)
            ________; // 在此处填入选项
        for (int j = 0; j <= i; j++)
            cout << a[j] << " ";
        cout << endl;
    }
    return 0;
}
答案:B

考点

递推一维数组

解题思维

排列组合问题:先判断是否考虑顺序(排列P vs 组合C),再确定是否允许重复。乘法原理分步,加法原理分类。

常见错误

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

详细解析(节选)

【考点】递推递推|一维数组模拟二维结构|空间优化技巧

考纲定位:本题直击 GESP 八级"数组与递推"核心考点,特别是"一维数组模拟二维结构"这一技能点。命题人专门放这道题,就是要卡住那些只会用二维数组、不懂空间优化的考生,他们往往在"能不能用更少内存"上栽跟头。这道题本质上考的是"空间换时间"的反向操作,用一维数组压缩二维状态。

解题思维:看到代码先观察:一维数组 a[N],外层 i 控制行数,内层 j 从 i-1 递减到 2。递减遍历是关键:从右向左更新,保证 a[j-1] 仍是上一行的值。杨辉三角递推式:a[j] = a[j] + a[j-1],对应选项 B。如果改成递增遍历,就必须用临时变量保存 a[j-1],复杂度上升。

陷阱拆解:A 选项 a[j] += a[j+1] 把当前值加右边,方向反了,会破坏上一行数据。C 选项 a[j-1] += a[j] 虽然也是加左边,但 a[j] 已被当前行覆盖,错误。D 选项 a[j+1] += a[j] 从左向右,更新时会覆盖左边,导致下一行数据污染。最阴险的是递减顺序,很多人直接写 j++ 或 j-- 不加思考,掉进"方向陷阱"。命题人利用"一维数组复用"这个高级技巧,卡住只会二维数组的考生。

反命题思维:如果改成从 0 到 i-1 递增遍历,就变成二维数组或需要临时变量;如果题目问"能否用更少空间",答案就是"能,一维数组即可"。刷到类似题,先问:遍历方向是否保证旧值不被覆盖。

同考点真题

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