递归函数
递归函数
递归函数的定义、执行过程与边界条件。
概念
递归函数在定义中调用自身,每展开一层就要保存当前状态,直到触及边界条件(base case)才逐层返回。正确递归必须:问题规模每次向边界靠近,且边界有明确返回值。与 cspj.cpp.function 的区别:递归强调自调用与展开/回溯过程。与 cspj.algo.recurrence-and-recursion 的区别:后者偏递推关系与算法设计,这里偏语言层面的递归函数执行。CSP-J 初赛几乎每年阅读程序都有递归 trace(阶乘、Fibonacci、自定义递归);2024 年同一卷上递归题密度尤其高。
CSP-J 常考
cspj-r1-2024第 27–32、38、40–42 题:阅读与完善程序多题,跟踪递归调用次数、返回值或填空补边界/递归式。cspj-r1-2019第 28–29、32–37 题:阅读判断与完善程序,递归函数在某输入下的输出或空位选项。cspj-r1-2025第 3、19 题:单选与阅读,考查递归深度或返回值。cspj-r1-2020第 28–29 题:阅读程序判断递归终止与返回路径。
int fact(int n) {
if (n <= 1) return 1; // 边界
return n * fact(n - 1);
}
int main() {
cout << fact(5) << endl; // 120
}
易错点
- 缺少边界或边界不可达会导致无限递归,阅读题问「是否一定终止」要看参数是否严格向边界变化。
- 同一表达式里多次调用递归(如
f(n-1) + f(n-1))与f(n-1) + f(n-2)调用次数差很多,手 trace 时画调用树比心算可靠。 - 完善程序空位常考
return后的递归式或if (n == 0)边界,勿与循环变量更新混淆。
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <iostream>2using namespace std;3const int maxn = 10000;4int n;5int a[maxn];6int b[maxn];7int f(int l, int r, int depth) {8 if (l > r)9 return 0;10 int min = maxn, mink;11 for (int i = l; i <= r; ++i) {12 if (min > a[i]) {13 min = a[i];14 mink = i;15 }16 }17 int lres = f(l, mink - 1, depth + 1);18 int rres = f(mink + 1, r, depth + 1);19 return lres + rres + depth * b[mink];20}21int main() {22 cin >> n;23 for (int i = 0; i < n; ++i)24 cin >> a[i];25 for (int i = 0; i < n; ++i)26 cin >> b[i];27 cout << f(0, n - 1, 1) << endl;28 return 0;29}- 28判断1.5 分
如果 a 数组有重复的数字,则程序运行时会发生错误。()
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <iostream>2using namespace std;3const int maxn = 10000;4int n;5int a[maxn];6int b[maxn];7int f(int l, int r, int depth) {8 if (l > r)9 return 0;10 int min = maxn, mink;11 for (int i = l; i <= r; ++i) {12 if (min > a[i]) {13 min = a[i];14 mink = i;15 }16 }17 int lres = f(l, mink - 1, depth + 1);18 int rres = f(mink + 1, r, depth + 1);19 return lres + rres + depth * b[mink];20}21int main() {22 cin >> n;23 for (int i = 0; i < n; ++i)24 cin >> a[i];25 for (int i = 0; i < n; ++i)26 cin >> b[i];27 cout << f(0, n - 1, 1) << endl;28 return 0;29}- 29判断1.5 分
如果 b 数组全为 0,则输出为 0。()
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <iostream>2using namespace std;3const int maxn = 10000;4int n;5int a[maxn];6int b[maxn];7int f(int l, int r, int depth) {8 if (l > r)9 return 0;10 int min = maxn, mink;11 for (int i = l; i <= r; ++i) {12 if (min > a[i]) {13 min = a[i];14 mink = i;15 }16 }17 int lres = f(l, mink - 1, depth + 1);18 int rres = f(mink + 1, r, depth + 1);19 return lres + rres + depth * b[mink];20}21int main() {22 cin >> n;23 for (int i = 0; i < n; ++i)24 cin >> a[i];25 for (int i = 0; i < n; ++i)26 cin >> b[i];27 cout << f(0, n - 1, 1) << endl;28 return 0;29}- 32单选3 分
当 n=10 时,若 b 数组满足,对任意 0≤i<n,都有
b[i] = i + 1,那么输出最大为()。
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <iostream>2using namespace std;3const int maxn = 10000;4int n;5int a[maxn];6int b[maxn];7int f(int l, int r, int depth) {8 if (l > r)9 return 0;10 int min = maxn, mink;11 for (int i = l; i <= r; ++i) {12 if (min > a[i]) {13 min = a[i];14 mink = i;15 }16 }17 int lres = f(l, mink - 1, depth + 1);18 int rres = f(mink + 1, r, depth + 1);19 return lres + rres + depth * b[mink];20}21int main() {22 cin >> n;23 for (int i = 0; i < n; ++i)24 cin >> a[i];25 for (int i = 0; i < n; ++i)26 cin >> b[i];27 cout << f(0, n - 1, 1) << endl;28 return 0;29}- 33单选4 分
(4分)当 n=100 时,若 b 数组满足,对任意 0≤i<n,都有
b[i]=1,那么输出最小为()。
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
1.(矩阵变幻)有一个奇幻的矩阵,在不停的变幻,其变幻方式为:
数字 0 变成矩阵
0 0
0 1
数字 1 变成矩阵
1 1
1 0
最初该矩阵只有一个元素 0,变幻 n 次后,矩阵会变成什么样?
例如,矩阵最初为:[0];
矩阵变幻 1 次后:
0 0
0 1
矩阵变幻 2 次后:
0 0 0 0
0 1 0 1
0 0 1 1
0 1 1 0
输入一行一个不超过 10 的正整数 n。输出变幻 n 次后的矩阵。
试补全程序。
提示:
<< 表示二进制左移运算符,例如 (11)2 << 2=(1100)2;
而 ^ 表示二进制异或运算符,它将两个参与运算的数中的每个对应的二进制位—进行比较,若两个二进制位相同,则运算结果的对应二进制位为 0 ,反之为 1。
#include <cstdio>
using namespace std;
int n;
const int max_size = 1 << 10;
int res[max_size][max_size];
void recursive(int x, int y, int n, int t) {
if (n == 0) {
res[x][y] = ①;
return;
}
int step = 1 << (n - 1);
recursive(②, n - 1, t);
recursive(x, y + step, n - 1, t);
recursive(x + step, y, n - 1, t);
recursive(③, n - 1, !t);
}
int main() {
scanf("%d", &n);
recursive(0, 0, ④);
int size = ⑤;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
printf("%d", res[i][j]);
puts("");
}
return 0;
}
#include <cstdio>2using namespace std;3int n;4const int max_size = 1 << 10;56int res[max_size][max_size];78void recursive(int x, int y, int n, int t) {9 if (n == 0) {10 res[x][y] = ①;11 return;12 }13 int step = 1 << (n - 1);14 recursive(②, n - 1, t);15 recursive(x, y + step, n - 1, t);16 recursive(x + step, y, n - 1, t);17 recursive(③, n - 1, !t);18}1920int main() {21 scanf("%d", &n);22 recursive(0, 0, ④);23 int size = ⑤;24 for (int i = 0; i < size; i++) {25 for (int j = 0; j < size; j++)26 printf("%d", res[i][j]);27 puts("");28 }29 return 0;30}- 34(①)单选空位 ①3 分
①处应填()
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
1.(矩阵变幻)有一个奇幻的矩阵,在不停的变幻,其变幻方式为:
数字 0 变成矩阵
0 0
0 1
数字 1 变成矩阵
1 1
1 0
最初该矩阵只有一个元素 0,变幻 n 次后,矩阵会变成什么样?
例如,矩阵最初为:[0];
矩阵变幻 1 次后:
0 0
0 1
矩阵变幻 2 次后:
0 0 0 0
0 1 0 1
0 0 1 1
0 1 1 0
输入一行一个不超过 10 的正整数 n。输出变幻 n 次后的矩阵。
试补全程序。
提示:
<< 表示二进制左移运算符,例如 (11)2 << 2=(1100)2;
而 ^ 表示二进制异或运算符,它将两个参与运算的数中的每个对应的二进制位—进行比较,若两个二进制位相同,则运算结果的对应二进制位为 0 ,反之为 1。
#include <cstdio>
using namespace std;
int n;
const int max_size = 1 << 10;
int res[max_size][max_size];
void recursive(int x, int y, int n, int t) {
if (n == 0) {
res[x][y] = ①;
return;
}
int step = 1 << (n - 1);
recursive(②, n - 1, t);
recursive(x, y + step, n - 1, t);
recursive(x + step, y, n - 1, t);
recursive(③, n - 1, !t);
}
int main() {
scanf("%d", &n);
recursive(0, 0, ④);
int size = ⑤;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
printf("%d", res[i][j]);
puts("");
}
return 0;
}
#include <cstdio>2using namespace std;3int n;4const int max_size = 1 << 10;56int res[max_size][max_size];78void recursive(int x, int y, int n, int t) {9 if (n == 0) {10 res[x][y] = ①;11 return;12 }13 int step = 1 << (n - 1);14 recursive(②, n - 1, t);15 recursive(x, y + step, n - 1, t);16 recursive(x + step, y, n - 1, t);17 recursive(③, n - 1, !t);18}1920int main() {21 scanf("%d", &n);22 recursive(0, 0, ④);23 int size = ⑤;24 for (int i = 0; i < size; i++) {25 for (int j = 0; j < size; j++)26 printf("%d", res[i][j]);27 puts("");28 }29 return 0;30}- 35(②)单选空位 ②3 分
②处应填()
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
1.(矩阵变幻)有一个奇幻的矩阵,在不停的变幻,其变幻方式为:
数字 0 变成矩阵
0 0
0 1
数字 1 变成矩阵
1 1
1 0
最初该矩阵只有一个元素 0,变幻 n 次后,矩阵会变成什么样?
例如,矩阵最初为:[0];
矩阵变幻 1 次后:
0 0
0 1
矩阵变幻 2 次后:
0 0 0 0
0 1 0 1
0 0 1 1
0 1 1 0
输入一行一个不超过 10 的正整数 n。输出变幻 n 次后的矩阵。
试补全程序。
提示:
<< 表示二进制左移运算符,例如 (11)2 << 2=(1100)2;
而 ^ 表示二进制异或运算符,它将两个参与运算的数中的每个对应的二进制位—进行比较,若两个二进制位相同,则运算结果的对应二进制位为 0 ,反之为 1。
#include <cstdio>
using namespace std;
int n;
const int max_size = 1 << 10;
int res[max_size][max_size];
void recursive(int x, int y, int n, int t) {
if (n == 0) {
res[x][y] = ①;
return;
}
int step = 1 << (n - 1);
recursive(②, n - 1, t);
recursive(x, y + step, n - 1, t);
recursive(x + step, y, n - 1, t);
recursive(③, n - 1, !t);
}
int main() {
scanf("%d", &n);
recursive(0, 0, ④);
int size = ⑤;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
printf("%d", res[i][j]);
puts("");
}
return 0;
}
#include <cstdio>2using namespace std;3int n;4const int max_size = 1 << 10;56int res[max_size][max_size];78void recursive(int x, int y, int n, int t) {9 if (n == 0) {10 res[x][y] = ①;11 return;12 }13 int step = 1 << (n - 1);14 recursive(②, n - 1, t);15 recursive(x, y + step, n - 1, t);16 recursive(x + step, y, n - 1, t);17 recursive(③, n - 1, !t);18}1920int main() {21 scanf("%d", &n);22 recursive(0, 0, ④);23 int size = ⑤;24 for (int i = 0; i < size; i++) {25 for (int j = 0; j < size; j++)26 printf("%d", res[i][j]);27 puts("");28 }29 return 0;30}- 36(③)单选空位 ③3 分
③处应填()
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
1.(矩阵变幻)有一个奇幻的矩阵,在不停的变幻,其变幻方式为:
数字 0 变成矩阵
0 0
0 1
数字 1 变成矩阵
1 1
1 0
最初该矩阵只有一个元素 0,变幻 n 次后,矩阵会变成什么样?
例如,矩阵最初为:[0];
矩阵变幻 1 次后:
0 0
0 1
矩阵变幻 2 次后:
0 0 0 0
0 1 0 1
0 0 1 1
0 1 1 0
输入一行一个不超过 10 的正整数 n。输出变幻 n 次后的矩阵。
试补全程序。
提示:
<< 表示二进制左移运算符,例如 (11)2 << 2=(1100)2;
而 ^ 表示二进制异或运算符,它将两个参与运算的数中的每个对应的二进制位—进行比较,若两个二进制位相同,则运算结果的对应二进制位为 0 ,反之为 1。
#include <cstdio>
using namespace std;
int n;
const int max_size = 1 << 10;
int res[max_size][max_size];
void recursive(int x, int y, int n, int t) {
if (n == 0) {
res[x][y] = ①;
return;
}
int step = 1 << (n - 1);
recursive(②, n - 1, t);
recursive(x, y + step, n - 1, t);
recursive(x + step, y, n - 1, t);
recursive(③, n - 1, !t);
}
int main() {
scanf("%d", &n);
recursive(0, 0, ④);
int size = ⑤;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
printf("%d", res[i][j]);
puts("");
}
return 0;
}
#include <cstdio>2using namespace std;3int n;4const int max_size = 1 << 10;56int res[max_size][max_size];78void recursive(int x, int y, int n, int t) {9 if (n == 0) {10 res[x][y] = ①;11 return;12 }13 int step = 1 << (n - 1);14 recursive(②, n - 1, t);15 recursive(x, y + step, n - 1, t);16 recursive(x + step, y, n - 1, t);17 recursive(③, n - 1, !t);18}1920int main() {21 scanf("%d", &n);22 recursive(0, 0, ④);23 int size = ⑤;24 for (int i = 0; i < size; i++) {25 for (int j = 0; j < size; j++)26 printf("%d", res[i][j]);27 puts("");28 }29 return 0;30}- 37(④)单选空位 ④3 分
④处应填()
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <algorithm>2#include <iostream>3using namespace std;45int n;6int d[50][2];7int ans;89void dfs(int n, int sum) {10 if (n == 1) {11 ans = max(sum, ans);12 return;13 }14 for (int i = 1; i < n; ++i) {15 int a = d[i - 1][0], b = d[i - 1][1];16 int x = d[i][0], y = d[i][1];17 d[i - 1][0] = a + x;18 d[i - 1][1] = b + y;19 for (int j = i; j < n - 1; ++j)20 d[j][0] = d[j + 1][0], d[j][1] = d[j + 1][1];21 int s = a + x + abs(b - y);22 dfs(n - 1, sum + s);23 for (int j = n - 1; j > i; --j)24 d[j][0] = d[j - 1][0], d[j][1] = d[j - 1][1];25 d[i - 1][0] = a, d[i - 1][1] = b;26 d[i][0] = x, d[i][1] = y;27 }28}2930int main() {31 cin >> n;32 for (int i = 0; i < n; ++i)33 cin >> d[i][0];34 for (int i = 0; i < n; ++i)35 cin >> d[i][1];36 ans = 0;37 dfs(n, 0);38 cout << ans << endl;39 return 0;40}原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写其它程序
原卷作
for (int i = 0; i < n; ++i) cin >> d[i][0];,常规写法应为for (int i = 0; i < n; ++i) cin >> d[i][0];洛谷抓取件 program.code 含行尾填充空格且 main 读入 d[i][1] 循环格式不同;pages/pg-06.png–pg-07.png 逐行核对后已恢复。
已按官方原件恢复:现为原卷原文
- 28判断1.5 分
若输入 n 为 0,此程序可能会死循环或发生运行错误。( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <algorithm>2#include <iostream>3using namespace std;45int n;6int d[50][2];7int ans;89void dfs(int n, int sum) {10 if (n == 1) {11 ans = max(sum, ans);12 return;13 }14 for (int i = 1; i < n; ++i) {15 int a = d[i - 1][0], b = d[i - 1][1];16 int x = d[i][0], y = d[i][1];17 d[i - 1][0] = a + x;18 d[i - 1][1] = b + y;19 for (int j = i; j < n - 1; ++j)20 d[j][0] = d[j + 1][0], d[j][1] = d[j + 1][1];21 int s = a + x + abs(b - y);22 dfs(n - 1, sum + s);23 for (int j = n - 1; j > i; --j)24 d[j][0] = d[j - 1][0], d[j][1] = d[j - 1][1];25 d[i - 1][0] = a, d[i - 1][1] = b;26 d[i][0] = x, d[i][1] = y;27 }28}2930int main() {31 cin >> n;32 for (int i = 0; i < n; ++i)33 cin >> d[i][0];34 for (int i = 0; i < n; ++i)35 cin >> d[i][1];36 ans = 0;37 dfs(n, 0);38 cout << ans << endl;39 return 0;40}原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写其它程序
原卷作
for (int i = 0; i < n; ++i) cin >> d[i][0];,常规写法应为for (int i = 0; i < n; ++i) cin >> d[i][0];洛谷抓取件 program.code 含行尾填充空格且 main 读入 d[i][1] 循环格式不同;pages/pg-06.png–pg-07.png 逐行核对后已恢复。
已按官方原件恢复:现为原卷原文
- 29判断1.5 分
若输入 n 为 20,接下来的输入全为 0,则输出为 0。( )
考虑如下递归算法
solve(n)
if n<=1 return 1
else if n>=5 return n*solve(n-2)
else return n*solve(n-1)
则调用 solve(7) 得到的返回结果为( )。
以下对递归方法的描述中,正确的是:( )。
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <iostream>2#include <cmath>3using namespace std;45int customFunction(int a, int b) {6 if (b == 0) {7 return a;8 }9 return a + customFunction(a, b-1);10}1112int main() {13 int x, y;14 cin >> x >> y;15 int result = customFunction(x, y);16 cout << pow(result, 2) << endl;17 return 0;18}19- 27判断1.5 分
当输入为
2 3时,customFunction(2, 3)的返回值为 64。( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <iostream>2#include <cmath>3using namespace std;45int customFunction(int a, int b) {6 if (b == 0) {7 return a;8 }9 return a + customFunction(a, b-1);10}1112int main() {13 int x, y;14 cin >> x >> y;15 int result = customFunction(x, y);16 cout << pow(result, 2) << endl;17 return 0;18}19- 28判断1.5 分
当 b 为负数时,
customFunction(a, b)会陷入无限递归。( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <iostream>2#include <cmath>3using namespace std;45int customFunction(int a, int b) {6 if (b == 0) {7 return a;8 }9 return a + customFunction(a, b-1);10}1112int main() {13 int x, y;14 cin >> x >> y;15 int result = customFunction(x, y);16 cout << pow(result, 2) << endl;17 return 0;18}19- 29判断1.5 分
当 b 的值越大,程序的运行时间越长。( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <iostream>2#include <cmath>3using namespace std;45int customFunction(int a, int b) {6 if (b == 0) {7 return a;8 }9 return a + customFunction(a, b-1);10}1112int main() {13 int x, y;14 cin >> x >> y;15 int result = customFunction(x, y);16 cout << pow(result, 2) << endl;17 return 0;18}19- 30单选3 分
单选题
- 当输入为
5 4时,customFunction(5, 4)的返回值为( )。
- 当输入为
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <iostream>2#include <cmath>3using namespace std;45int customFunction(int a, int b) {6 if (b == 0) {7 return a;8 }9 return a + customFunction(a, b-1);10}1112int main() {13 int x, y;14 cin >> x >> y;15 int result = customFunction(x, y);16 cout << pow(result, 2) << endl;17 return 0;18}19- 31单选3 分
如果输入
x=3和y=3,则程序的最终输出为( )。
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <iostream>2#include <cmath>3using namespace std;45int customFunction(int a, int b) {6 if (b == 0) {7 return a;8 }9 return a + customFunction(a, b-1);10}1112int main() {13 int x, y;14 cin >> x >> y;15 int result = customFunction(x, y);16 cout << pow(result, 2) << endl;17 return 0;18}19- 32单选4 分
(4 分)若将
customFunction函数改为return a + customFunction(a-1, b-1);,并输入3 3,则程序的最终输出为( )。
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
(汉诺塔问题) 给定三根柱子,分别标记为 A、B 和 C。初始状态下,柱子 A 上有若干个圆盘,这些圆盘从上到下按从小到大的顺序排列。任务是将这些圆盘全部移到柱子 C 上,且必须保持原有顺序不变。在移动过程中,需要遵守以下规则:
- 只能从一根柱子的顶部取出圆盘,并将其放入另一根柱子的顶部。
- 每次只能移动一个圆盘。
- 小圆盘必须始终在大圆盘之上。
试补全程序。
#include <iostream>
#include <vector>
using namespace std;
void move(char src, char tgt) {
cout << "从柱子" << src << "挪到柱子" << tgt << endl;
}
void dfs(int i, char src, char tmp, char tgt) {
if (i == ___①___) {
move(___②___);
return;
}
dfs(i - 1, ___③___);
move(src, tgt);
dfs(___⑤___, ___④___);
}
int main() {
int n;
cin >> n;
dfs(n, 'A', 'B', 'C');
}
#include <iostream>2#include <vector>3using namespace std;45void move(char src, char tgt) {6 cout << "从柱子" << src << "挪到柱子" << tgt << endl;7}89void dfs(int i, char src, char tmp, char tgt) {10 if (i == ___①___) {11 move(___②___);12 return;13 }14 dfs(i - 1, ___③___);15 move(src, tgt);16 dfs(___⑤___, ___④___);17}1819int main() {20 int n;21 cin >> n;22 dfs(n, 'A', 'B', 'C');23}- 38(①)单选空位 ①3 分
① 处应填( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
(汉诺塔问题) 给定三根柱子,分别标记为 A、B 和 C。初始状态下,柱子 A 上有若干个圆盘,这些圆盘从上到下按从小到大的顺序排列。任务是将这些圆盘全部移到柱子 C 上,且必须保持原有顺序不变。在移动过程中,需要遵守以下规则:
- 只能从一根柱子的顶部取出圆盘,并将其放入另一根柱子的顶部。
- 每次只能移动一个圆盘。
- 小圆盘必须始终在大圆盘之上。
试补全程序。
#include <iostream>
#include <vector>
using namespace std;
void move(char src, char tgt) {
cout << "从柱子" << src << "挪到柱子" << tgt << endl;
}
void dfs(int i, char src, char tmp, char tgt) {
if (i == ___①___) {
move(___②___);
return;
}
dfs(i - 1, ___③___);
move(src, tgt);
dfs(___⑤___, ___④___);
}
int main() {
int n;
cin >> n;
dfs(n, 'A', 'B', 'C');
}
#include <iostream>2#include <vector>3using namespace std;45void move(char src, char tgt) {6 cout << "从柱子" << src << "挪到柱子" << tgt << endl;7}89void dfs(int i, char src, char tmp, char tgt) {10 if (i == ___①___) {11 move(___②___);12 return;13 }14 dfs(i - 1, ___③___);15 move(src, tgt);16 dfs(___⑤___, ___④___);17}1819int main() {20 int n;21 cin >> n;22 dfs(n, 'A', 'B', 'C');23}- 40(③)单选空位 ③3 分
③ 处应填( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
(汉诺塔问题) 给定三根柱子,分别标记为 A、B 和 C。初始状态下,柱子 A 上有若干个圆盘,这些圆盘从上到下按从小到大的顺序排列。任务是将这些圆盘全部移到柱子 C 上,且必须保持原有顺序不变。在移动过程中,需要遵守以下规则:
- 只能从一根柱子的顶部取出圆盘,并将其放入另一根柱子的顶部。
- 每次只能移动一个圆盘。
- 小圆盘必须始终在大圆盘之上。
试补全程序。
#include <iostream>
#include <vector>
using namespace std;
void move(char src, char tgt) {
cout << "从柱子" << src << "挪到柱子" << tgt << endl;
}
void dfs(int i, char src, char tmp, char tgt) {
if (i == ___①___) {
move(___②___);
return;
}
dfs(i - 1, ___③___);
move(src, tgt);
dfs(___⑤___, ___④___);
}
int main() {
int n;
cin >> n;
dfs(n, 'A', 'B', 'C');
}
#include <iostream>2#include <vector>3using namespace std;45void move(char src, char tgt) {6 cout << "从柱子" << src << "挪到柱子" << tgt << endl;7}89void dfs(int i, char src, char tmp, char tgt) {10 if (i == ___①___) {11 move(___②___);12 return;13 }14 dfs(i - 1, ___③___);15 move(src, tgt);16 dfs(___⑤___, ___④___);17}1819int main() {20 int n;21 cin >> n;22 dfs(n, 'A', 'B', 'C');23}- 41(④)单选空位 ④3 分
④ 处应填( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
(汉诺塔问题) 给定三根柱子,分别标记为 A、B 和 C。初始状态下,柱子 A 上有若干个圆盘,这些圆盘从上到下按从小到大的顺序排列。任务是将这些圆盘全部移到柱子 C 上,且必须保持原有顺序不变。在移动过程中,需要遵守以下规则:
- 只能从一根柱子的顶部取出圆盘,并将其放入另一根柱子的顶部。
- 每次只能移动一个圆盘。
- 小圆盘必须始终在大圆盘之上。
试补全程序。
#include <iostream>
#include <vector>
using namespace std;
void move(char src, char tgt) {
cout << "从柱子" << src << "挪到柱子" << tgt << endl;
}
void dfs(int i, char src, char tmp, char tgt) {
if (i == ___①___) {
move(___②___);
return;
}
dfs(i - 1, ___③___);
move(src, tgt);
dfs(___⑤___, ___④___);
}
int main() {
int n;
cin >> n;
dfs(n, 'A', 'B', 'C');
}
#include <iostream>2#include <vector>3using namespace std;45void move(char src, char tgt) {6 cout << "从柱子" << src << "挪到柱子" << tgt << endl;7}89void dfs(int i, char src, char tmp, char tgt) {10 if (i == ___①___) {11 move(___②___);12 return;13 }14 dfs(i - 1, ___③___);15 move(src, tgt);16 dfs(___⑤___, ___④___);17}1819int main() {20 int n;21 cin >> n;22 dfs(n, 'A', 'B', 'C');23}- 42(⑤)单选空位 ⑤3 分
⑤ 处应填( )
函数 calc(n) 的定义如下,则 calc(5) 的返回值是多少?( )
int calc(int n) {
if (n <= 1) return 1;
if (n % 2 == 0) return calc(n / 2) + 1;
else return calc(n - 1) + calc(n - 2);
}
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <algorithm>2#include <cstdio>3#include <cstring>4inline int gcd(int a, int b) {5 if (b == 0)6 return a;7 return gcd(b, a % b);8}9int main() {10 int n;11 scanf("%d", &n);12 int ans = 0;13 for (int i = 1; i <= n; ++i) {14 for (int j = i + 1; j <= n; ++j) {15 for (int k = j + 1; k <= n; ++k) {16 if (gcd(i, j) == 1 && gcd(j, k) == 117 && gcd(i, k) == 1) {18 ++ans;19 }20 }21 }22 }23 printf("%d\n", ans);24 return 0;25}- 19单选3 分
将第 7 行的
gcd(b, a%b)改为gcd(a, a%b)后,程序可能出现的问题是( )。