CSP-J 2024 入门级 第一轮(初赛) 阅读程序(3)

【题目】

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 2311,进行有限次递归调用后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。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值