内容正文:
青少年软件编程(Python)等级考试试卷(四级)
202403真题与解析
分数:100 题数:38 测试时长:60分钟
一、单选题(共25题,每题2分,共50分)
1、运行如下代码,若输入整数3,则最终输出的结果为?()
def f(x):
if x == 1:
s = 1
else:
s = f(x - 1) * x
return s
n = int(input("请输入一个大于1的整数:"))
print(f(n) + f(n - 1))
A.2 B.4 C.8 D.16
2. 运行下列程序,输出的结果是?()
def fun(x):
if x > 3:
return x * fun(x - 1)
else:
return x
print(fun(6))
A.120 B.360 C.720 D.60
3. 下列关于递归的描述不正确的是?()
A.递归函数一定包含if语句
B.递归函数体内一定包含调用自身的语句
C.在调用自身函数时需要明确的边界终止条件与边界值
D.递归算法一般代码简洁,执行效率高,空间复杂度低
4. 运行下列程序,输出的结果是?()
def fun(a, n):
s = 0
for i in range(1, n + 1):
temp = str(a) * i
s += int(temp)
return s
print(fun(1, 3))
A.3 B.6 C.12 D.123
5. 运行下列程序,输出的结果是?()
def fun(a, b):
s = 0
a = a[: -1]
for i in range(len(a)):
s += int(a[i]) * b ** i
return s
print(fun("45", 16))
A.69 B.45 C.64 D.61
6. 一个荷花池,第一天荷花开放得很少,第二天开放的数量是第一天的两倍, 之后的每一天,荷花都会以前一天两倍的数量开放。如果到第30天,荷花就 开满了整个池塘,设第一天开一朵,编程求第30天共开了多少朵荷花。下面 空白处的代码填写正确的是?()
s = 0
t = 1
for i in range(1, ①):
s += t
②
print(s)
A.30, t = t * 2 B.31, t = t * 2
C.31, t += 2 D.30, t*=2
7. 解决下列问题时,时间复杂度最大的是?()
A.输入n个不同的包含两位小数的实数,计算这n个数的和
B.在n个数据中,查找数据k
C.将n个数据用冒泡排序实现排序
D.计算算式1 - 2 + 3 - 4...的结果,n为偶数
8. 以下关于分治算法的描述正确的是?()
A.各个子问题既相互独立又相互联系 B.问题可以分解成若干个规模较小的相同问题
C.可以直接对问题进行求解 D.子问题的解不能合并成原问题的解
9. 下列选项中哪一项使用了分治算法?()
A.二分搜索 B.选择搜索 C.插入搜索 D.顺序搜索
10. 不超过20个元素的降序数列,使用对分查找能找到指定的元素,可能的查找 次数不包括?()
A.3 B.4 C.5 D.6
11. 下面程序段的输出结果是?()
def add_Run(L = None):
if L is None:
L = ['Lying']
else:
L.append("Run")
return L
add_Run()
print(add_Run())
print(add_Run('Lying'))
A.['Lying']
['Run']
B.['Lying']
['Lying']
['Lying", "Run']
C.['Lying"]
['Lying", "Run']
D.[]
['Lying", "Run']
12. 下面关于计数器的程序,输出结果正确的是?()
count = 0
def increment():
global count
count += 1
print("计数器的值:", count)
increment()
increment()
increment()
A.计数器的值:1
计数器的值:2
计数器的值:3
B.计数器的值:0
计数器的值:1
计数器的值:2
C.计数器的值:1
计数器的值:1
计数器的值:1
D.计数器的值:3
13. 下列程序段的输出结果是?()
L = []
x = 3
def test(x):
L.append(x)
x = 5
test(x)
print("L = {}, x = {}".format(L, x))
A.L = [3], x = 3
B.L = [5], x = 5
C.L = [3], x = 5
D.L = 3, x = 5
14. 以下程序,运行程序输出结果正确的是?()
def demo(x):
return x * 2
print(demo(demo(1)))
A.return None
B.2
C.4
D.8
15. Python使用下列哪个函数接收用户输入的数据?()
A.accept()
B.input()
C.print()
D.login()
16. 下面程序段的输出结果正确的是?()
def power():
y = 'world'
x = 'python'
return z
print(power())
A.z B.x + " " + y
C.python world D.python"orld
17. 下列关于Python函数的描述中,不正确的是?()
A.自定义函数时用到的关键字是def
B.在python函数中,至少有一条return语句
C.函数print()可以一次输出多个参数,如print("1", "2", 3, [4])
D.用函数eval()可以用于求字符串里表达式的值,如eval (3 + 5 - 1')
18. 关于以下代码的描述中,正确的是?()
#求两个正方形的面积差
def MianJiCha(a, b):
s = a ** 2 - b ** 2
return s
a = 5
b = 10
c = MianJiCha(b, a) + a
A.代码运行后,变量c的值是80 B.函数名是MianliCha(a, b)
C.可以用MianJiCha(100)的形式调用此函数 D.代码运行时会报错
19. 下列关于Python函数的说法中,错误的是?()
A.利用函数可以降低编程复杂度,增加代码可读性
B.函数可以重复调用
C.函数可以降低修改代码的工作量
D.调用函数时,每次都必须输入相同的参数值
20. 下列选项中,调用下列代码定义的函数时,程序会报错的是?()
def ShuChu(a, b, c):
print(c, b, a)
A.ShuChu(1, 2, 3)
B.ShuChu("1", 2, "3, 4")
C.ShuChu(1, 2, 3)
D.ShuChu(1, 2, 3, 4)
21. 下列选项中,调用以下代码定义的函数时,程序会报错的是?()
def kp(a, b, c):
print(a, b, c)
A.kp(1, b = 2, 3)
B.kp(a = 3, b = 1, c = 2)
C.kp(1, 2, 3)
D.kp(1, b = 2, c = 3)
22. 下列代码的输出结果是?()
>>> s = lambda m, n: m * n
>>> s(6, 6)
A.6 B.6, 6 C.36 D.12
23. 以下函数定义错误的选项是?()
A.def aFunc(m, n): print(m, n)
B.def aFunc(m, n = 2): print(m, n)
C.def aFunc(*m, n): print(m, n)
D.def aFunc(m, *n): print(m, n)
24. 用于安装Python第三方库的工具是?()
A.install B.pip C.Wheel D.setup
25. 编程时,如果只需要导入某第三方库中的某个成员,需要使用到的关键字是? ()
A.from B.as C.into D.inport
二、判断题(共10题,共20分)
26. 若某个问题既能用递归算法求解,又能用递推算法求解,则使用递归方法求 解更容易,效率也高得多。()
27. 如下代码因为递归的边界条件设置错误,产生了无限递归程序报错。()
def fun(n):
if n > 10:
return 0
else:
return n + fun(n - 1)
print(fun(10))
28. 算法的时间复杂度与空间复杂度没有必然关系。()
29. 已知有n本按照书名拼音排序好的图书,使用对分查找法搜索其中任何一本 书,最多查找次数为4次,则n的值有可能为10。()
30. 函数定义语句def f(c = 1, d = 2, a, b): 是正确的,因为默认值形参要放在前面。()
31. return语句可以返回任何数据类型的值,包括整数、浮点数、字符串、列表、 元组、字典等。()
32.
def ZiDian(**kwargs):
print(kwargs)
ziDian(a = 1)
运行上面的代码后,输出结果为{a: 1}。()
33. 以下代码可以正常运行,输出8。()
def qh(a, b = 3):
print(a + b)
qh(b = 2, 6)
34. 代码>>>lambda: x = 2, y = 3: x + y的运行结果是5。()
35. 使用pip install -upgrade numpy命令能够升级numpy科学计算库。()
三、编程题(共3题,共30分)
36. 数的分解给出一个正整数a,要求分解成若干个正整数的乘积,即 a = a1×a2×a3×...×an,并且1 < a1 ≤ a2 ≤ a3 ≤....an,问这样分解的种类有多少。注 意到a = a也是一种分解。
例如,8可以分解成 8 = 2 * 2 * 2, 8 = 2 * 4, 8 = 8 总共3种。
代码如下,完善划线处的代码:
def fun(x, y = 2):
if x == 1:
global ans
①
for i in range(y, x + 1):
if ②:
fun(x // i, i)
lst = [2, 8, 9, 20] # 测试数据
for i in lst:
ans = 0
③
print(ans)
程序运行结果如下:
1
3
2
4
37. 购物组合小明单位发了100元的购物卡,小明到超市买三类洗化用品:洗发水(15元)、香皂(2元)、牙刷(5元)。要100元正好花掉,可有哪些购买组合?
def gouwu(money):
for i in range(0, money // 15 + 1):
for j in range(0, money // 2 + 1):
for k in range(0, ①):
if ②:
print('可选择的购买组合:\t 购买洗发水 {} 瓶,香皂 {} 块,牙刷 {} 个。'.format(③))
gouwu(100)
38. 回文素数回文素数是指一个不小于11的自然数n从左向右和从右向左读,其结果值相同且是素数,即称n为回文素数。一种求解的方法是先判断一个自然数是否为回文数,再判断它是否为素数。如果两个判断都成立,则该自然数是回文素数。请补全代码,找出自然数1000以内的所有回文素数。
def ①(n):
for i in range(2, n):
if ②:
break
else:
return True
# 判断是否为回文数
def HuiWenshu(n):
n = str(n)
if n == ③:
return True
else:
return False
for i in range(11, 1001):
if Zhishu(i)==True ④:
print('{}是回文素数!'.format(i))
参考答案及解析:
一、单选题
1. 答案:C
- 解析:输入3时,`f(3)=f(2)*3=(f(1)*2)*3=(1*2)*3=6`,`f(2)=f(1)*2=1*2=2`,所以`f(3)+f(2)=6+2=8`。
2. 答案:B
- 解析:`fun(6)=6*fun(5)=6*5*fun(4)=6*5*4*fun(3)=6*5*4*3=360`。
3. 答案:D
- 解析:递归算法一般代码简洁,但执行效率不一定高,且空间复杂度可能较高,因为递归调用会占用栈空间。
4. 答案:D
- 解析:递推函数求解,本题是求 1+11+111 之和。
5. 答案:A
- 解析:函数`fun`将字符串形式的十六进制数转换为十进制数,“45”对应的十进制数为69。
6. 答案:B
- 解析:递推函数求解,本题递推关系是 t = t*2, 循环次数是 30 次。
7. 答案:C
- 解析:冒泡排序的时间复杂度为$O(n^2)$,其他选项的时间复杂度相对较低。计算n个数的和、查找数据k、计算算式结果的时间复杂度通常为$O(n)$或更低。
8. 答案:B
- 解析:分治算法将问题分解成若干个规模较小的相同问题,各个子问题相互独立,子问题的解可以合并成原问题的解。
9. 答案:A
- 二分搜索使用了分治算法。
10. 答案:D
- 对于不超过20个元素的降序数列,使用对分查找,最多查找次数为4次($2^4<20<2^5$),所以不包括6次。
11. 答案:C
- 第一次调用`add_Run()`时创建了列表`['Lying']`并返回,第二次调用时在这个列表基础上添加`"Run"`并返回`['Lying', 'Run']`,第三次调用时传入参数`'Lying'`,直接添加`"Run"`并返回`['Lying', 'Run']`。
12. 答案:A
- 函数`increment()`每次调用都将全局变量`count`加1并输出当前值。
13. 答案:A
- 函数`test`将参数`x`的值3添加到全局列表`L`中,然后局部变量`x`被赋值为5,但不影响外部的全局变量`x`。
14. 答案:C
- 调用二次,1 乘以二次 2,因此结果为 4。
15. 答案:B
- Python使用`input()`函数接收用户输入的数据。
16. 答案:C
-该函数作用为连接字符串。
17. 答案:B
- Python函数中不一定要有`return`语句。
18. 答案:A
- 函数`MianJiCha`计算两个正方形的面积差,`c = MianJiCha(b, a) + a = (10**2 - 5**2) + 5 = 75 + 5 = 80`。
19. 答案:D
- 调用函数时不一定每次都必须输入相同的参数值,可以使用默认值参数、关键字参数等方式改变参数的值。
20. 答案:D
- 函数`ShuChu`定义了三个参数,调用时传入四个参数会报错。
21. 答案:A
- 调用函数时关键字参数必须在位置参数后面,`kp(1, b = 2, 3)`错误。
22. 答案:C
- 匿名函数`s = lambda m, n: m * n`,`s(6, 6)`计算6*6=36。
23. 答案:A
- *m 表示是可变参数,可传入值的个数不确定。可变参数只能放在不可变参数的后面,不然解释器将不能识别哪些值传给可变参数,哪些值传给不可变参数。
24. 答案:B
- `pip`是用于安装Python第三方库的工具。
25. 答案:A
- 如果只需要导入某第三方库中的某个成员,需要使用`from`关键字。
二、判断题
26. 答案:错
- 虽然递归算法代码简洁,但效率不一定比递推算法高,递归可能会有重复计算,效率可能较低。
27. 答案:对
- 递归的边界条件设置错误,产生了无限递归程序报错。
28. 答案:对
- 算法的时间复杂度与空间复杂度没有必然关系。
29. 答案:对
- 根据二分查找最坏查找次数可得,答案对。
30. 答案:错
- 在函数定义中,默认值参数要放在没有默认值的参数后面。
31. 答案:对
- `return`语句可以返回任何数据类型的值。
32. 答案:对
- `**kwargs`接收关键字参数并以字典形式存储,输出结果为`{a: 1}`。
33. 答案:错
- 调用函数时关键字参数必须在位置参数后面,`qh(b = 2, 6)`错误。
34. 答案:错
- `>>>lambda: x = 2, y = 3: x + y`是一个错误的语法,不能直接这样使用匿名函数。
35. 答案:对
- 使用`pip install -upgrade numpy`命令能够升级`numpy`科学计算库。
三、编程题
36.def fun(x, y=2):
if x == 1:
global ans
ans += 1
for i in range(y, x + 1):
if x % i == 0:
fun(x // i, i)
lst = [2, 8, 9, 20] # 测试数据
for i in lst:
ans = 0
fun(i)
print(ans)
评分标准:
(1)ans += 1 或等效答案;(2 分)
(2)x % i == 0 或等效答案;(3 分)
(3)fun(i) 或等效答案。(3 分)
解析:
(1)当`x == 1`时,说明已经完成了一种有效的分解,此时将全局变量`ans`加 1,以记录分解的种类增加了一种。
(2)在循环中判断`x % i == 0`,这是为了确定当前的数`i`是否能整除`x`。如果能整除,说明可以以`i`作为一个因子进行下一步的分解,这样就可以通过递归调用继续探索其他可能的分解方式。
(3)对于每个输入的数`i`,调用`fun(i)`来开始对这个数进行分解并统计分解的种类数。这个过程通过递归地尝试不同的因子来实现对给定数的所有可能分解方式的探索。
37. 参考代码:
def gouwu(money):
for i in range(0, money // 15 + 1):
for j in range(0, money // 2 + 1):
for k in range(0, money // 5 + 1):
if 15 * i + 2 * j + 5 * k == money:
print('可选择的购买组合:\t 购买洗发水 {} 瓶,香皂 {} 块,牙刷 {} 个。'.format(i, j, k))
gouwu(100)
参考答案:
(1)money//5+1 或等效答案;(3 分)
(2) i*15+j*2+k*5==money 或等效答案;(4 分)
(3) i,j,k 或等效答案。(3 分)
解析:
(1)对于牙刷数量的循环范围,因为最多可以买`money`元钱能买的最多牙刷数量就是`money // 5`个,再加上 1 确保能遍历所有可能的数量情况。
(2)判断条件`i*15 + j*2 + k*5 == money`是确保购买洗发水、香皂和牙刷的总花费等于给定的总金额`money`,只有满足这个条件才是一种有效的购买组合。
(3)在格式化字符串中传入`i`、`j`、`k`分别对应购买的洗发水、香皂和牙刷的数量,从而输出具体的购买组合。
38.参考代码:
def Zhishu(n):
for i in range(2, n):
if n % i == 0:
break
else:
return True
# 判断是否为回文数
def HuiWenshu(n):
n = str(n)
if n == n[::-1]:
return True
else:
return False
for i in range(11, 1001):
if Zhishu(i)==True and HuiWenshu(i):
print('{}是回文素数!'.format(i))
评分标准:
(1)ZhiShu 或等效答案;(2 分)
(2)n%i==0 或等效答案;(2 分)
(3)n[::-1] 或等效答案;(4 分)
(4)and HuiWenShu(i)==True 或等效答案。(4 分)
解析:
(1)函数名应该为`Zhishu`,这个函数用于判断一个数是否为素数。
(2)在判断素数的函数中,遍历从 2 到 `n` 的数,如果 `n` 能被 `i` 整除(即 `n % i == 0`),那么 `n` 就不是素数,此时跳出循环。
(3)在判断回文数的函数中,将数字转换为字符串 `n`,然后判断这个字符串与其反转后的字符串(`n[::-1]`)是否相同,如果相同则是回文数。
(4)在遍历 11 到 1000 的数时,需要同时满足是素数(通过调用 `Zhishu(i)` 判断)和回文数(通过调用 `HuiWenshu(i)` 判断),所以用 `and` 连接这两个条件判断。如果两个条件都为真,则输出该数是回文素数。
学科网(北京)股份有限公司
$$