林老师 · 客观题题库 · 第 14 章 递归与递推 · 知识细节练习

第 14 章 递归与递推 · 知识细节练习

100 题 · 每题对应一个知识细节 · 全部原创
真题
复刻
试卷编号ORIG-第14章递归与递推-知识细节练习
题目总数100 题 · 100 分
试卷类型客观题
考生须知:
① 本卷共 16 大部分,合计 100 题 · 100 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 100 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

递归基本概念

6 QUESTIONS · 2 POINTS EACH
第 1 题 A1 未作答

判断题:递归 = 函数在定义中直接或间接调用它自身。

(1 分)
第 2 题 A2 未作答

判断题:递归的两要素:① 边界条件(出口——最小情形直接返回结果);② 递归关系(把问题化归为规模更小的同类问题)。

(1 分)
第 3 题 A3 未作答

判断题:递归执行时每一层调用都记录在系统调用栈里:先层层进入(问题变小),再层层返回(把结果传回去);栈最深时的高度就是递归深度。

(1 分)
第 4 题 A4 未作答

判断题:任何递归都可以改写为循环(递推),任何循环也可以改写为递归——两者的表达能力是等价的。

(1 分)
第 5 题 A5 未作答

单选题:递归层数过深(例如对 10610^6 规模直接层层递归)会导致?

(1 分)
第 6 题 A6 未作答

判断题:递归的每一层调用都要占用栈帧(保存参数、局部变量、返回地址),常数开销比等价的循环大。

(1 分)

经典递归问题

7 QUESTIONS · 2 POINTS EACH
第 7 题 B1 未作答

判断题:阶乘的递归定义:n!=n×(n1)!n! = n \times (n-1)!,边界 0!=10! = 1

(1 分)
第 8 题 B2 未作答

单选题:斐波那契数列 f(1)=f(2)=1f(1) = f(2) = 1f(n)=f(n1)+f(n2)f(n) = f(n-1) + f(n-2)f(6)f(6) 的值是?

(1 分)
第 9 题 B3 未作答

判断题:直接递归求 f(n)f(n) 时,同一个子问题会被重复计算很多遍(例如 f(2)f(2) 被反复调用),时间复杂度是指数级 O(2n)O(2^n)

(1 分)
第 10 题 B4 未作答

单选题:nn 个盘子的汉诺塔问题,最少移动次数是?

(1 分)
第 11 题 B5 未作答

单选题:汉诺塔移动次数 h(n)h(n) 满足的递推式是?

(1 分)
第 12 题 B6 未作答

判断题:辗转相除法求最大公约数:gcd(a, b) = gcd(b, a % b),当 b == 0 时返回 a——结构天然适合递归实现。

(1 分)
第 13 题 B7 未作答

判断题:递归求数组和:sum(l, r) = a[l] + sum(l+1, r),边界 l > r 时返回 0——把问题分解成"第一个元素 + 剩余部分的和"。

(1 分)

递推

7 QUESTIONS · 2 POINTS EACH
第 14 题 C1 未作答

判断题:递推 = 从已知的初始值出发,按递推公式从前往后一项一项算出后续各项。

(1 分)
第 15 题 C2 未作答

判断题:递归是自顶向下(大问题拆成子问题),递推是自底向上(从小问题算到大问题)——方向相反。

(1 分)
第 16 题 C3 未作答

单选题:递推的三要素是?

(1 分)
第 17 题 C4 未作答

单选题:求斐波那契第 5050 项:直接递归约需 2502^{50} 级别次调用,改用递推(循环填表)只需?

(1 分)
第 18 题 C5 未作答

判断题:递推不必存整个数组:如斐波那契只需两个变量滚动更新,空间复杂度从 O(n)O(n) 降到 O(1)O(1)

(1 分)
第 19 题 C6 未作答

单选题:爬楼梯,每次走 11 级或 22 级。f(n)=f(n1)+f(n2)f(n) = f(n-1) + f(n-2)f(1)=1f(1) = 1f(2)=2f(2) = 2。上 55 级楼梯共有几种走法?

(1 分)
第 20 题 C7 未作答

判断题:递推通常用循环 + 数组(或滚动变量)实现,按规模从小到大"填表"。

(1 分)

回溯

7 QUESTIONS · 2 POINTS EACH
第 21 题 D1 未作答

判断题:回溯 = 尝试一个选择 → 递归继续走 → 走不通或走完就撤销该选择(恢复现场)→ 再试下一个选择。

(1 分)
第 22 题 D2 未作答

单选题:回溯算法的标准三部曲是?

(1 分)
第 23 题 D3 未作答

判断题:回溯的本质是深度优先搜索(DFS):沿一条路径走到底,走不通就退回上一步换条路。

(1 分)
第 24 题 D4 未作答

单选题:33 个不同元素的全排列共有几种?

(1 分)
第 25 题 D5 未作答

单选题:33 个元素的集合共有多少个子集(含空集)?

(1 分)
第 26 题 D6 未作答

判断题:回溯 = 枚举所有方案的通用框架:排列、组合、子集都能用同一个"选择 → 递归 → 撤销"模板写出来。

(1 分)
第 27 题 D7 未作答

判断题:回溯的复杂度通常是指数级:全排列 O(n!)O(n!)、子集 O(2n)O(2^n)——数据规模一大,就容易超时。

(1 分)

差分与倍增概念

6 QUESTIONS · 2 POINTS EACH
第 28 题 E1 未作答

判断题:差分数组 d[i]=a[i]a[i1]d[i] = a[i] - a[i-1] 记录相邻元素的差;对区间 [l,r][l, r] 每个数加 xx,只需 d[l] += xd[r+1] -= x 两处标记。

(1 分)
第 29 题 E2 未作答

判断题:差分与前缀和互为逆运算:对差分数组做前缀和还原出原数组,对前缀和数组做差分也还原出原数组。

(1 分)
第 30 题 E3 未作答

判断题:"多次区间整体加、最后统一查询"的场景用差分:每次修改 O(1)O(1)、最后还原 O(n)O(n)

(1 分)
第 31 题 E4 未作答

判断题:倍增 = 每次翻倍地跳(1,2,4,8,1, 2, 4, 8, \dots):把 O(n)O(n) 的逐步推进压缩成 O(log2n)O(\log_2 n) 步。

(1 分)
第 32 题 E5 未作答

判断题:快速幂把指数按二进制拆分(1,2,4,81, 2, 4, 8 次方),乘法次数从 O(b)O(b) 降到 O(log2b)O(\log_2 b)——倍增思想的典型应用。

(1 分)
第 33 题 E6 未作答

判断题:倍增类算法的复杂度是 O(log2n)O(\log_2 n)——因为翻倍次数就是对数级。

(1 分)

差分概念

7 QUESTIONS · 2 POINTS EACH
第 34 题 F1 未作答

判断题:差分数组的构造:d[1]=a[1]d[1] = a[1]d[i]=a[i]a[i1]d[i] = a[i] - a[i-1]i2i \geq 2)——一遍 O(n)O(n) 扫描即可。

(1 分)
第 35 题 F2 未作答

单选题:对区间 [l,r][l, r] 每个数加 xx,差分操作是?

(1 分)
第 36 题 F3 未作答

判断题:对差分数组求前缀和即还原原数组——差分标记只影响区间内、区间外自动抵消。

(1 分)
第 37 题 F4 未作答

单选题:mm 次区间加 + 最后 11 次还原查询,差分的总复杂度是?

(1 分)
第 38 题 F5 未作答

判断题:差分适合"修改集中、查询靠后";若修改与查询频繁交替,应改用其他更合适的数据结构。

(1 分)
第 39 题 F6 未作答

单选题:n=m=105n = m = 10^5 时,暴力区间加约 101010^{10} 次操作会超时,差分约需?

(1 分)
第 40 题 F7 未作答

判断题:先差分做区间修改、再前缀和还原——两者结合是处理区间批量操作的标准套路。

(1 分)

递归递推应用技巧

5 QUESTIONS · 2 POINTS EACH
第 41 题 G1 未作答

判断题:递归函数必须先写出口(边界条件)再写递归调用——否则会无限递归下去。

(1 分)
第 42 题 G2 未作答

判断题:递归参数应体现"问题规模在缩小"(如区间端点 lr 每次收缩),保证每次递归都向出口靠近。

(1 分)
第 43 题 G3 未作答

判断题:递推结果很大时(如斐波那契第 10610^6 项),每步计算后都对 MOD 取模,可以防止溢出——加减乘运算中"先算再模"与"边算边模"结果一致。

(1 分)
第 44 题 G4 未作答

判断题:递归深度可控(对数级/较浅)时用递归更直观;深度可能过大、或要求常数空间时改用递推。

(1 分)
第 45 题 G5 未作答

判断题:斐波那契第 9090 项约 2.9×10182.9 \times 10^{18},已接近 long long 上限——递推题要先估算结果范围、选对整数类型。

(1 分)

易错综合

5 QUESTIONS · 2 POINTS EACH
第 46 题 H1 未作答

单选题:递归函数缺少边界条件(出口),会发生什么?

(1 分)
第 47 题 H2 未作答

单选题:斐波那契直接递归是指数复杂度的根本原因是?

(1 分)
第 48 题 H3 未作答

单选题:递归函数里该写 return f(n-1) 却写成 f(n-1)(丢弃了返回值),会导致?

(1 分)
第 49 题 H4 未作答

单选题:爬楼梯 f(1)=1f(1) = 1f(2)=2f(2) = 2。若把 f(2)f(2) 误写成 11,则按 f(n)=f(n1)+f(n2)f(n) = f(n-1) + f(n-2) 算出的 f(4)f(4) 会变成?

(1 分)
第 50 题 H5 未作答

判断题:以下结论全部正确——"递归与循环等价;递推把斐波那契降到 O(n)O(n);回溯本质是 DFS;差分与前缀和互为逆运算"。

(1 分)

递归基础代码

7 QUESTIONS · 2 POINTS EACH
第 51 题 I1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int f(int n) {                       // 计算 n!
04    if (n == 0) return 1;            // 边界
05    return n * f(n - 1);             // 递归关系
06}
07int main() { cout << f(5); return 0; }

单选题:程序输出是?

(1 分)
第 52 题 I2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int f(int n) {
04    if (n == 1 || n == 2) return 1;  // 边界
05    return f(n - 1) + f(n - 2);      // 递推式
06}
07int main() { cout << f(7); return 0; }

单选题:程序输出是?

(1 分)
第 53 题 I3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int s(int n) {                       // 求 1 + 2 + ... + n
04    if (n == 1) return 1;
05    return n + s(n - 1);
06}
07int main() { cout << s(100); return 0; }

单选题:程序输出是?

(1 分)
第 54 题 I4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03void p(int n) {
04    if (n == 0) return;
05    p(n - 1);                  // 先递归
06    cout << n << " ";          // 返回时才打印
07}
08int main() { p(5); return 0; }

单选题:程序输出是?

(1 分)
第 55 题 I5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03void p(int n) {
04    if (n == 0) return;
05    cout << n << " ";          // 进入时就打印
06    p(n - 1);
07}
08int main() { p(5); return 0; }

单选题:程序输出是?

(1 分)
第 56 题 I6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int g(int a, int b) {                // 辗转相除
04    if (b == 0) return a;
05    return g(b, a % b);
06}
07int main() { cout << g(48, 36); return 0; }

单选题:程序输出是?

(1 分)
第 57 题 I7 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int s(int n) {                        // 求 1~n 中所有奇数的和
04    if (n == 0) return 0;
05    if (n % 2 == 1) return n + s(n - 1);
06    return s(n - 1);
07}
08int main() { cout << s(10); return 0; }

单选题:程序输出是?

(1 分)

递归过程理解

7 QUESTIONS · 2 POINTS EACH
第 58 题 J1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03void f(int n) {
04    if (n == 0) return;
05    cout << n << " ";          // 进入时打印
06    f(n - 1);
07}
08int main() { f(3); return 0; }

单选题:程序输出是?

(1 分)
第 59 题 J2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03void f(int n) {
04    if (n == 0) return;
05    f(n - 1);
06    cout << n << " ";          // 返回时打印
07}
08int main() { f(3); return 0; }

单选题:程序输出是?

(1 分)
第 60 题 J3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03void f(int n) {
04    if (n == 0) return;
05    cout << n << " ";          // 进入时打印
06    if (n >= 2) f(n - 2);      // 左分支
07    f(n - 1);                  // 右分支
08}
09int main() { f(3); return 0; }

单选题:程序输出是?

(1 分)
第 61 题 J4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int cnt = 0;
04int f(int n) {
05    cnt++;                     // 每进入一次计数
06    if (n == 0) return 0;
07    return f(n - 1) + 1;
08}
09int main() { f(5); cout << cnt; return 0; }

单选题:程序输出是?

(1 分)
第 62 题 J5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int dep = 0, mx = 0;
04void f(int n) {
05    dep++;
06    mx = max(mx, dep);         // 记录最大深度
07    if (n == 0) { dep--; return; }
08    f(n - 1);
09    dep--;
10}
11int main() { f(5); cout << mx; return 0; }

单选题:程序输出是?

(1 分)
第 63 题 J6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03void f(int n) {
04    if (n == 0) return;
05    f(n / 2);                  // 先递归
06    cout << n % 2;             // 返回时输出余数
07}
08int main() { f(13); return 0; }

单选题:程序输出是?

(1 分)
第 64 题 J7 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[6] = {1, 2, 3, 4, 5, 6};
04void rev(int l, int r) {
05    if (l >= r) return;
06    swap(a[l], a[r]);          // 交换两端
07    rev(l + 1, r - 1);         // 递归处理中间
08}
09int main() {
10    rev(0, 5);
11    for (int i = 0; i < 6; i++) cout << a[i] << " ";
12    return 0;
13}

单选题:程序输出是?

(1 分)
拾壹

递推代码

6 QUESTIONS · 2 POINTS EACH
第 65 题 K1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    long long f[50];
05    f[1] = f[2] = 1;                     // 初始值
06    for (int i = 3; i <= 10; i++)
07        f[i] = f[i - 1] + f[i - 2];      // 递推公式(正向填表)
08    cout << f[10];
09    return 0;
10}

单选题:程序输出是?

(1 分)
第 66 题 K2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int f[20];
05    f[1] = 1; f[2] = 2;                  // 爬楼梯初始值
06    for (int i = 3; i <= 6; i++)
07        f[i] = f[i - 1] + f[i - 2];
08    cout << f[6];
09    return 0;
10}

单选题:程序输出是?

(1 分)
第 67 题 K3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    long long s = 1;
05    for (int i = 1; i <= 6; i++) s *= i;   // 循环版阶乘
06    cout << s;
07    return 0;
08}

单选题:程序输出是?

(1 分)
第 68 题 K4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {3, 1, 4, 1, 5};
05    int s[6] = {0};
06    for (int i = 1; i <= 5; i++)
07        s[i] = s[i - 1] + a[i - 1];        // 前缀和递推
08    for (int i = 1; i <= 5; i++) cout << s[i] << " ";
09    return 0;
10}

单选题:程序输出是?

(1 分)
第 69 题 K5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int c[6][6] = {0};
05    for (int i = 0; i <= 5; i++) {
06        c[i][0] = c[i][i] = 1;                     // 两边都是 1
07        for (int j = 1; j < i; j++)
08            c[i][j] = c[i - 1][j - 1] + c[i - 1][j];  // 递推公式
09    }
10    for (int j = 0; j <= 5; j++) cout << c[5][j] << " ";
11    return 0;
12}

单选题:程序输出是?

(1 分)
第 70 题 K6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    const int MOD = 1000000007;
05    long long a = 1, b = 1;                    // f(1), f(2)
06    for (int i = 3; i <= 8; i++) {
07        long long c = (a + b) % MOD;           // 边算边取模
08        a = b; b = c;                          // 滚动更新
09    }
10    cout << b;
11    return 0;
12}

单选题:程序输出是?

(1 分)
拾贰

差分与倍增代码

5 QUESTIONS · 2 POINTS EACH
第 71 题 L1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int n = 5, d[6] = {0};            // 1 下标差分数组(原数组全 0)
05    int l = 1, r = 3, x = 2;
06    d[l] += x;                        // 区间 [1,3] 加 2
07    d[r + 1] -= x;
08    for (int i = 1; i <= n; i++) {    // 前缀和还原
09        d[i] += d[i - 1];
10        cout << d[i] << " ";
11    }
12    return 0;
13}

单选题:程序输出是?

(1 分)
第 72 题 L2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int n = 5, d[6] = {0};
05    d[1] = 1; d[3] = -1;              // 相当于区间 [1,2] 加 1 的标记
06    for (int i = 1; i <= n; i++) {
07        d[i] += d[i - 1];
08        cout << d[i] << " ";
09    }
10    return 0;
11}

单选题:程序输出是?

(1 分)
第 73 题 L3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int x = 1, cnt = 0;
05    while (x < 1000) {                // 每次翻倍
06        x *= 2;
07        cnt++;
08    }
09    cout << cnt;
10    return 0;
11}

单选题:程序输出是?

(1 分)
第 74 题 L4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int n = 13, p = 1;
05    while (n) {
06        if (n & 1) cout << p << " ";  // 该位为 1 对应的 2 的幂
07        n >>= 1;
08        p <<= 1;
09    }
10    return 0;
11}

单选题:程序输出是?

(1 分)
第 75 题 L5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int n = 5, d[6] = {0};
05    d[2] += 3; d[5] -= 3;             // 区间 [2,4] 加 3
06    d[1] += 1; d[3] -= 1;             // 区间 [1,2] 加 1
07    for (int i = 1; i <= n; i++) {
08        d[i] += d[i - 1];
09        cout << d[i] << " ";
10    }
11    return 0;
12}

单选题:程序输出是?

(1 分)
拾叁

回溯代码

7 QUESTIONS · 2 POINTS EACH
第 76 题 M1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int n = 3, a[5], used[5] = {0}, cnt = 0;
04void dfs(int k) {                      // 正在放第 k 个位置(0 开始)
05    if (k == n) { cnt++; return; }     // 排满一种
06    for (int i = 1; i <= n; i++)
07        if (!used[i]) {
08            used[i] = 1;               // 选择
09            a[k] = i;
10            dfs(k + 1);                // 递归
11            used[i] = 0;               // 撤销
12        }
13}
14int main() { dfs(0); cout << cnt; return 0; }

单选题:程序输出是?

(1 分)
第 77 题 M2 未作答

单选题:n=4n = 4 个不同元素的全排列共有多少个?

(1 分)
第 78 题 M3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int n = 3, cnt = 0;
04void dfs(int k) {                      // 对第 k 个元素做选择
05    if (k > n) { cnt++; return; }      // 每个元素都决定完 = 一个子集
06    dfs(k + 1);                        // 不选 k
07    dfs(k + 1);                        // 选 k
08}
09int main() { dfs(1); cout << cnt; return 0; }

单选题:程序输出是?

(1 分)
第 79 题 M4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int n = 5, k = 3, cnt = 0, a[10];
04void dfs(int pos, int st) {            // 已选 pos 个,从 st 开始选下一个
05    if (pos == k) { cnt++; return; }
06    for (int i = st; i <= n; i++) {
07        a[pos] = i;
08        dfs(pos + 1, i + 1);           // 递增选数,避免重复组合
09    }
10}
11int main() { dfs(0, 1); cout << cnt; return 0; }

单选题:程序输出是?

(1 分)
第 80 题 M5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {2, 3, 5, 6, 8};
04int n = 5, target = 8, cnt = 0;
05void dfs(int i, int s) {               // 考虑 a[i],当前和为 s
06    if (s == target) { cnt++; return; }
07    if (i == n || s > target) return;  // 提前返回:越界或和已超
08    dfs(i + 1, s + a[i]);              // 选 a[i]
09    dfs(i + 1, s);                     // 不选 a[i]
10}
11int main() { dfs(0, 0); cout << cnt; return 0; }

单选题:程序输出是?

(1 分)
第 81 题 M6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int n = 4, cnt = 0, col[5] = {0};
04bool ok(int k, int i) {                // 第 k 行的皇后放第 i 列是否合法
05    for (int j = 1; j < k; j++)
06        if (col[j] == i || abs(col[j] - i) == k - j) return false;  // 同列或同斜线
07    return true;
08}
09void dfs(int k) {                      // 正在放第 k 行的皇后
10    if (k == n + 1) { cnt++; return; }
11    for (int i = 1; i <= n; i++)
12        if (ok(k, i)) { col[k] = i; dfs(k + 1); }
13}
14int main() { dfs(1); cout << cnt; return 0; }

单选题:程序输出是?

(1 分)
第 82 题 M7 未作答

判断题:回溯在递归返回后必须撤销本次选择(如 used[i] = 0、弹出已选元素),否则后续分支会误以为该元素仍被占用,导致漏解。

(1 分)
拾肆

综合代码

7 QUESTIONS · 2 POINTS EACH
第 83 题 N1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {0, 2, 5, 1, 4, 3};    // 1 下标原数组
05    int d[6] = {0};
06    d[1] = a[1];
07    for (int i = 2; i <= 5; i++) d[i] = a[i] - a[i - 1];
08    for (int i = 1; i <= 5; i++) cout << d[i] << " ";
09    return 0;
10}

单选题:程序输出是?

(1 分)
第 84 题 N2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int n = 6, d[7] = {0};
05    d[2] += 3; d[6] -= 3;             // 区间 [2,5] 加 3
06    for (int i = 1; i <= n; i++) {
07        d[i] += d[i - 1];
08        cout << d[i] << " ";
09    }
10    return 0;
11}

单选题:程序输出是?

(1 分)
第 85 题 N3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03long long pw(long long a, long long b) {
04    long long r = 1;
05    while (b) {
06        if (b & 1) r = r * a;          // b 的二进制当前位是 1
07        a = a * a;                     // a 翻倍:a, a^2, a^4, ...
08        b >>= 1;
09    }
10    return r;
11}
12int main() { cout << pw(2, 10); return 0; }

单选题:程序输出是?

(1 分)
第 86 题 N4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03const long long MOD = 1000000007;
04long long pw(long long a, long long b) {
05    long long r = 1;
06    while (b) {
07        if (b & 1) r = r * a % MOD;
08        a = a * a % MOD;
09        b >>= 1;
10    }
11    return r;
12}
13int main() {
14    cout << pw(3, 5) << " " << pw(2, 10);
15    return 0;
16}

单选题:程序输出是?

(1 分)
第 87 题 N5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[7] = {1, 3, 5, 7, 9, 11, 13};   // 升序数组
04int f(int l, int r, int x) {           // 在 [l, r] 中找 x
05    if (l > r) return -1;
06    int m = (l + r) / 2;
07    if (a[m] == x) return m;
08    if (a[m] < x) return f(m + 1, r, x);
09    return f(l, m - 1, x);
10}
11int main() { cout << f(0, 6, 9); return 0; }

单选题:程序输出是?

(1 分)
第 88 题 N6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int h[10];
05    h[1] = 1;                              // 1 个盘只需 1 步
06    for (int i = 2; i <= 5; i++)
07        h[i] = 2 * h[i - 1] + 1;           // 递推公式
08    cout << h[5];
09    return 0;
10}

单选题:程序输出是?

(1 分)
第 89 题 N7 未作答

01#include <bits/stdc++.h>
02using namespace std;
03void h(int n, char a, char b, char c) {   // n 个盘从 a 柱移到 c 柱,b 辅助
04    if (n == 1) { cout << a << "->" << c << " "; return; }
05    h(n - 1, a, c, b);                     // 上面 n-1 个盘先移到 b
06    cout << a << "->" << c << " ";         // 最大的盘移到 c
07    h(n - 1, b, a, c);                     // n-1 个盘从 b 移到 c
08}
09int main() { h(3, 'A', 'B', 'C'); return 0; }

单选题:程序输出是?

(1 分)
拾伍

完善程序

5 QUESTIONS · 2 POINTS EACH
第 90 题 O1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int f(int n) {
04    if (______) return 1;      // 边界:0! = 1
05    return n * f(n - 1);
06}
07int main() { cout << f(5); return 0; }

单选题:横线处应填入?

(1 分)
第 91 题 O2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    long long f[40];
05    f[1] = f[2] = 1;
06    for (int i = 3; i <= 20; i++)
07        f[i] = ______;         // 递推公式
08    cout << f[20];
09    return 0;
10}

单选题:横线处应填入?

(1 分)
第 92 题 O3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int n = 3, a[5], used[5] = {0};
04void dfs(int k) {
05    if (k == n) {
06        for (int i = 0; i < n; i++) cout << a[i] << " ";
07        cout << endl;
08        return;
09    }
10    for (int i = 1; i <= n; i++)
11        if (!used[i]) {
12            used[i] = 1;
13            a[k] = i;
14            dfs(k + 1);
15            ______;           // 撤销,恢复现场
16        }
17}
18int main() { dfs(0); return 0; }

单选题:横线处应填入?

(1 分)
第 93 题 O4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03long long pw(long long a, long long b) {
04    long long r = 1;
05    while (b) {
06        if (______) r = r * a;   // b 的二进制当前位为 1 才乘
07        a = a * a;
08        b >>= 1;
09    }
10    return r;
11}
12int main() { cout << pw(2, 10); return 0; }

单选题:横线处应填入?

(1 分)
第 94 题 O5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int s(int n) {              // 求 1 + 2 + ... + n
04    if (______) return 0;
05    return n + s(n - 1);
06}
07int main() { cout << s(100); return 0; }

单选题:横线处应填入?

(1 分)
拾陆

代码易错与综合

6 QUESTIONS · 2 POINTS EACH
第 95 题 P1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int f(int n) {
04    // 缺少边界条件
05    return n + f(n - 1);
06}
07int main() { f(5); return 0; }

单选题:程序会发生什么?

(1 分)
第 96 题 P2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int f(int n) {
04    if (n == 1) return 1;
05    f(n - 1) * n;      // 错误:计算结果没有 return
06}
07int main() { cout << f(5); return 0; }

单选题:程序会发生什么?

(1 分)
第 97 题 P3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int n = 3, used[4] = {0}, cnt = 0, a[4];
04void dfs(int k) {
05    if (k == n) { cnt++; return; }
06    for (int i = 1; i <= n; i++)
07        if (!used[i]) {
08            used[i] = 1;
09            a[k] = i;
10            dfs(k + 1);
11            // 错误:缺少 used[i] = 0
12        }
13}
14int main() { dfs(0); cout << cnt; return 0; }

单选题:程序输出是?(正确结果应为 6

(1 分)
第 98 题 P4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int f[10];
05    f[1] = 1; f[2] = 2;               // 爬楼梯初始值
06    for (int i = 2; i <= 4; i++)      // 错误:循环应从 3 开始
07        f[i] = f[i - 1] + f[i - 2];   // f[2] 被覆盖成 1(f[0] 未初始化)
08    cout << f[4];
09    return 0;
10}

单选题:程序输出是?(正确结果应为 5

(1 分)
第 99 题 P5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int cnt = 0;
04int fib(int n) {
05    cnt++;                           // 每次进入计数
06    if (n == 1 || n == 2) return 1;
07    return fib(n - 1) + fib(n - 2);
08}
09int main() { fib(6); cout << cnt; return 0; }

单选题:程序输出是?

(1 分)
第 100 题 P6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int f[5];                        // 下标范围 0 ~ 4
05    f[1] = f[2] = 1;
06    for (int i = 3; i <= 5; i++)     // 错误:f[5] 越界
07        f[i] = f[i - 1] + f[i - 2];
08    cout << f[5];
09    return 0;
10}

单选题:程序会发生什么?

(1 分)