递归
基础知识
【NOIP 2018 普及组初赛 q10】下面的故事与( )算法有着异曲同工之妙。
从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:“从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:‘从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事……’”
A. 枚举 B. 递归 C. 贪心 D. 分治
编程练习
阅读题
【CSP 2020 入门组第一轮 q06】设A是介个实数的数组,考虑下面的递归算法:
XYZ (A[1..n])
1. if n= 1 then return A[1]
2. else temp ← XYZ (A[l..n-1])
3. if temp < A[n]
4. then return temp
5. else return A[n]
请问算法XYZ的输出是什么?()。
A. A数组的平均 B. A数组的最小值
C. A数组的中值 D. A数组的最大值
【CSP 2020 入门组第一轮 q18】阅读程序(程序输入不超过数组或字符串定义的范围)
#include <algorithm>
#include <iostream>
using namespace std;
int n;
int d[50][2];
int ans;
void dfs(int n, int sum) {
if (n == 1) {
ans = max(sum, ans);
return;
}
for (int i = 1; i < n; ++i) {
int a = d[i - 1][0], b = d[i - 1][1];
int x = d[i][0], y = d[i][1];
d[i - 1][0] = a + x;
d[i - 1][1] = b + y;
for (int j = i; j < n - 1; ++j)
d[j][0] = d[j + 1][0], d[j][1] = d[j + 1][1];
int s = a + x + abs(b - y);
dfs(n - 1, sum + s);
for (int j = n - 1; j > i; --j)
d[j][0] = d[j - 1][0], d[j][1] = d[j - 1][1];
d[i - 1][0] = a, d[i - 1][1] = b;
d[i][0] = x, d[i][1] = y;
}
}
int main() {
cin >> n;
for (int i = 0; i < n; ++i)
cin >> d[i][0];
for (int i = 0; i < n;++i)
cin >> d[i][1];
ans = 0;
dfs(n, 0);
cout << ans << endl;
return 0;
}
假设输入的n是不超过50的正整数,d[i][0]、d[i][i]都是不超过10000的正整数,完成下面的判断题和单选题:
1)若输入 n 为 0,此程序可能会死循环或发生运行错误。( )
A. 正确 B. 错误
2)若输入 n 为 20,接下来的输入全为 0,则输出为 0。( )
A. 正确 B. 错误
3)输出的数一定不小于输入的 d[i][0] 和 d[i][l] 的任意一个。( )
A. 正确 B. 错误
4)若输入的 n 为 20,接下来的输入是 20 个 9 和 20 个 0,则输出为( )。
A. 1890 B. 1881 C. 1908 D. 1917
5)若输入的 n 为 30,接下来的输入是 30 个 0 和 30 个 5,则输出为( )。
A. 2000 B. 2010 C. 2030 D. 2020
6)(4分)若输入的 n 为 15,接下来的输入是 15 到 1,以及 15到1,则输出为( )。
A. 2440 B. 2220 C. 2240 D. 2420
备注:上题第6小问的计算可能用到平方和公式
【NOIP 2018 普及组初赛 q20】阅读程序写结果:
#include <iostream>
using namespace std;
int n, m;
int findans(int n, int m) {
if (n == 0) return m;
if (m == 0) return n % 3;
return findans(n - 1, m) - findans(n, m - 1) + findans(n - 1, m - 1);
}
int main(){
cin >> n >> m;
cout << findans(n, m) << endl;
return 0;
}
输入:5 6
【NOIP 2017 普及组初赛 q24】阅读程序写结果:
#include<iostream>
using namespace std;
int g(int m, int n, int x)
{
int ans = 0;
int i;
if (n == 1)
return 1;
for (i = x; i <= m / n; i++)
ans += g(m - i, n - 1, i);
return ans;
}
int main()
{
int t, m, n;
cin >> m >> n;
cout << g(m, n, 0) << endl;
return 0;
}
输入:7 3
输出:_____