【题目】
CSP-J 2024 入门级 第一轮(初赛) 阅读程序(3)
1 #include <iostream>
2 #include <cmath>
3 using namespace std;
4
5 int customFunction(int a, int b) {
6 if (b == 0) {
7 return a;
8 }
9 return a + customFunction(a , b - 1);
10 }
11
12 int 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 }
判断题:
27.当输入为“2 3”时,customFunction(2,3)的返回值为“64”。( )
28.当 b 为负数时,customFunction(a,b)会陷入无限递归。( )
29.当 b 的值越大,程序的运行时间越长。( )
单选题
30,当输入为“5 4”时,customFunction(5,4)的返回值为( )。
A.5
B.25
C.250
D.625
31.如果输入 x = 3 和 y = 3,则程序的最终输出为()
A."27”
B."81”
C."144”
D."256
32.若将customFunction 函数改为“return a + customFunction(a-1,b-1);并输入“3 3”,则程序的最终输出为()。
A.9
B.16
C.25
D.36
【题目考点】
1. 递归
【解题思路】
递归函数customFunction(a, b)求的是(b+1)个a的加和,也就是
a
(
b
+
1
)
a(b+1)
a(b+1)
主函数调用customFunction(x, y),返回值result是y+1个x的加和,也就是
x
(
y
+
1
)
x(y+1)
x(y+1)
最后输出result的平方,因此该程序求的是
(
x
(
y
+
1
)
)
2
(x(y+1))^2
(x(y+1))2
【试题答案及解析】
判断题:
27. 当输入为“2 3”时,customFunction(2, 3)的返回值为“64”。( )
答:F
customFunction(x, y)的返回值为
x
(
y
+
1
)
x(y+1)
x(y+1)
customFunction(2, 3)的返回值为
2
∗
(
3
+
1
)
=
8
2*(3+1)=8
2∗(3+1)=8,叙述错误。
28. 当 b 为负数时,customFunction(a,b)会陷入无限递归。( )
答:T或F
当b为负数时,参数b只会越来越小,递归出口的条件if(b==0)
不会满足,因此递归会一直进行下去。
“无限递归”如果指的是一种表象,看起来在不停地递归调用,程序无法停止,那么该叙述是正确的。
但递归实际上不会无限进行下去,每次递归调用都会在栈区占一定的空间,当栈区没有空间时,会发生栈溢出,产生运行时错误。
如果假想栈区空间非常大(大于32G),b每次递归调用后都会减1,如果b是正数,在有限次调用后b会为0,进入递归出口。如果b是负数,由于b是int类型变量,不断减1后可以达到的最小值为
−
2
31
-2^{31}
−231。再次减1后,根据补码相加的计算原理,b的值会变为
2
31
−
1
2^{31}-1
231−1,进行有限次递归调用后b还是会变为0。因此当不考虑栈区大小的情况下,递归也不会进行无限次。
该题选T或F都算对。
29. 当 b 的值越大,程序的运行时间越长。( )
答:T或F
如果考虑栈区有限,该递归函数调用的次数是y次,每次调用的时间复杂度是
O
(
1
)
O(1)
O(1),总时间复杂度是
O
(
y
)
O(y)
O(y)。实参y是形参b的值,该函数的运行时间随着b的增大而增大,叙述正确。
如果认为栈区空间非常大(大于32G),根据上题的解析,则当b的值为负数时,比当b为正数时不断进行递归调用直至b为0,进行的递归调用的次数更多。该描述不正确。
该题选T或F都对。
单选题
30. 当输入为“5 4”时,customFunction(5, 4)的返回值为( )。
A.5
B.25
C.250
D.625
答:B
customFunction(x, y)的返回值为
x
(
y
+
1
)
x(y+1)
x(y+1)
customFunction(5, 4)的返回值为
5
∗
(
4
+
1
)
=
25
5*(4+1)=25
5∗(4+1)=25,选B。
31. 如果输入 x = 3 和 y = 3,则程序的最终输出为()
A."27”
B."81”
C."144”
D."256
答:C
该程序求的是
(
x
(
y
+
1
)
)
2
=
(
3
∗
(
3
+
1
)
)
2
=
1
2
2
=
144
(x(y+1))^2=(3*(3+1))^2=12^2=144
(x(y+1))2=(3∗(3+1))2=122=144,选C
32. 若将customFunction 函数改为“return a + customFunction(a-1, b-1);并输入“3 3”,则程序的最终输出为()。
A.9
B.16
C.25
D.36
答:D
该问题可以直接模拟递归过程,也可以使用递归变递推的方法
设c[a][b]的值为customFunction(a, b)的返回值。
初始状态为:当b为0时,值为a。
则c[0][0] = 0
递推关系为c[a][b] = a+c[a-1][b-1]
可以通过c[a-1][b-1]推出c[a][b]。那么就可以通过c[0][0]推出c[1][1]再推出c[2][2]再推出c[3][3]。
c[1][1] = 1+c[0][0] = 1
c[2][2] = 2+c[1][1] = 3
c[3][3] = 3+c[2][2] = 6
调用customFunction(3,3)返回6,再求平方,结果为36,选D。