内容正文:
青少年软件编程(Python)等级考试试卷(四级)
202106真题与解析
分数:100 题数:38 测试时长:60分钟
一、单选题(共25题,每题2分,共50分)
1. 对自然数1至n求和,如果将递推式f(n)=f(n-1)+n(n>1)转化成递归函数,则递归出口是?( )
A、f(1)=1
B、f(1)=0
C、f(0)=1
D、f(0)=0
2. 对比两个求等差数列1+2+…+n的和的程序,其算法效率?( )
程序1:
n=int(input())
s=(1+n)*n/2
print(s)
程序2:
n=int(input())
s=0
for i in range(n+1):
s=s+i
print(s)
A、程序1比程序2高
B、程序2比程序1高
C、一样高
D、不能判断
3. 若以下程序段的运行结果为“*#*#*”,则空格(1)(2)处填写结果不可能为?( )
def f(n):
s=""
for i in range((1),n):
if i % 2==1:
s=s+"*"
else:
s=s+"#"
return s
print(f((2)))
A、3,8
B、3,7
C、9,14
D、1,6
4. 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子。假如兔子都不死,要求输出一年内兔子的数量是多少。如果采用递归算法来编程,则核心的递归逻辑应该是?( )
A、f(n) =n*f(n-1)
B、f(n) = f(n-1)+n
C、f(n) = f(n-1)+f(n-2)
D、f(n) = f(n-1)+ (n-1)f(n-2)
5. 下列程序使用了哪种算法?( )
def fact(n):
if n==0:
return 1
else:
return n*fact(n-1)
A、递推
B、递归
C、排序
D、分治
6. 以下几项关于函数的说法,错误的是?( )
A、函数是一段具有特定功能的语句组
B、调用函数时,参数传入的顺序必须与定义时保持一致
C、在一个程序中,函数的定义可以放在函数调用代码之后
D、使用函数可以增加代码重复利用率,还可以降低维护难度
7. 下面关于递归的描述不正确的是?( )
A、递归思想是将大型复杂的问题转化为一个与原问题相似的规模较小的问题来求解
B、递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,它不是分治策略的具体体现
C、递归必须有终止递归的条件
D、递归是在过程或函数里调用自身
8. 下列哪项不是分治算法所具有的特征?( )
A、该问题的规模缩小到一定的程度就可以容易地解决
B、该问题可以分解为若干个规模较小的不同问题
C、利用该问题分解出的子问题的解可以合并为该问题的解
D、该问题所分解出的各个子问题是相互独立的
9. 以下能正确计算出“1!+3!+5!”值(n!=1x2x3…xn)的自定义函数是?( )
A、def f():
s=0
t=1
for i in range(1,6,2):
t=t*i
s=s+t
return s
B、def f():
s=0
t=0
for i in range(1,6,2):
t=t*i
s=s+t
return s
C、def f():
s=0
t=1
for i in range(1,6,2):
t=t*i
if i%2==1:
s=s+t
return s
D、def f():
s=0
t=1
for i in range(1,6):
t=t*i
if i%2==1:
s=s+t
return s
10. 下面关于递归算法的描述,错误的是?( )
A、任何递归程序都可以改写成非递归程序
B、定义简单,逻辑清晰
C、算法的执行效率较高
D、原问题与子问题在结构上必须相似
11. 下列关于函数的描述正确的是?( )
A、使用函数的唯一目的是减少代码的重用
B、不带return的函数返回值是None
C、带有默认值的参数可以放在位置参数之前
D、函数可以有多个参数,参数之间使用;隔开
12. 以下程序是用什么算法思维来显示数列1,4,7,10,13,16 ?( )
a=1
for i in range(6):
print(a)
a+=3
A、递归
B、递推
C、分治
D、枚举
13. 运行下列这段程序,正确的输出结果是?( )
def f(a,b):
c=a**2+b
b=a
return c
a=5
b=100
c=f(a,b)+b
print(c)
A、210
B、225
C、130
D、115
14. 安装wheel,wheel用于离线安装已经下载到本地的whl文件,可以在命令窗口直接运行?( )
A、pip list
B、pip wheel
C、pip unistall wheel
D、pip install wheel
15. 下列选项中,哪个选项调用如下函数会报错?( )
def show(numbers):
for n in numbers:
print(n)
A、show([4,5,6])
B、show('Chinese')
C、show(3,4)
D、show((4,5,6))
16. 运行下列程序,输出结果正确的是?( )
def demo(lst, k):
if k<len(lst):
return lst[k:]+lst[:k]
lst=[1,2,3,4,5,6]
print(demo(lst,4))
A、[4,5,6,1,2,3]
B、[5,6,1,2,3,4]
C、[6,5,4,3,2,1]
D、[1,2,3,4,5,6]
17. 在解决问题过程中,常用的“二分法”是一种什么算法?( )
A、分治
B、递归
C、推理
D、递推
18. 在Python Shell提示符下输入以下哪个选项,回车后,再输入pi,回车,能得到数值3.141592653589793?( )
A、import math
B、import math as pi
C、from math import PI
D、from math import *
19. 下列程序段中自定义函数do(n)的作用是?( )
def do(n):
s=0
f=1
for i in range(1,n+1,2):
s=s+1/i*f
f=-f
return s
print(do(10))
A、求1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9+1/10的值
B、求1+1/3+1/5+1/7+1/9的值
C、求1-1/3+1/5-1/7+1/9-1/10的值
D、求1-1/3+1/5-1/7+1/9的值
20. 下列几个选项中,不是Python定义函数规则的是?( )
A、def关键字开头,后接函数名加括号,以冒号结束
B、Python定义函数时,必须声明形参类型
C、返回值写在return后面
D、使用函数名( )的方式调用函数
21. 以下哪项不是使用分治法解决问题的步骤?( )
A、分解
B、求解
C、合并
D、判断
22. 在Python中,调用下面函数的返回值为?( )
def fun():
x=101
A、None
B、101
C、程序报错
D、x=101
23. 下列哪个选项的返回值与其他三项不同?( )
A、round(3.176)
B、abs(-3)
C、ord('3')
D、len([1,2,3])
24. 下列哪个是正确的函数名?( )
A、Plan_2021
B、2021plan
C、return
D、10plan10
25. 以下函数的返回值是?( )
def pic(a:int,b:str)str:
c=a*b
print(c)
return c
pic(5,’*#*’)
A、*#**#**#**#**#*
B、5
C、5*#*
D、程序出错
二、判断题(共10题,每题2分,共20分)
26. 递归方法的运用不仅会简化主程序的设计,也会大大减少程序的代码量。
27. 在Python中定义函数时不需要声明函数的返回值类型。
28. Python程序是模块化架构,以.py的文件可以作为一个模块被引用。一些Python爱好者和支持者开发和分享了大量扩展库(包),可以根据需要用包管理器来安装或自定义,体现了Python语言强大的扩展性。
29. 通常问题的规模越大算法执行的时间就越长,算法执行时间的增长率和问题规模的增长关系,称为空间复杂度。
30. 将一个大问题分解为若干子问题,且子问题与大问题是相同的问题,就构成了递归。
31. 将一个复杂的问题分解成若干个规模较小的子问题后,能不能利用分解出的子问题的解合并得到原问题的解是最关键的特征,它决定了是否可以使用分治算法。
32. 已知大写字母“A”对应的ASCII码值为65,变量ch保存输入的大写英文字母,则语句chr((ord(ch)+1-ord("A")) % 26+ord("A"))能实现大写英文字母后移一位,如A→B, B→C, ……Y→Z, Z→A。
33. 下列程序段运行后,打印结果为9。
def f():
s=0
for i in range(3,1,-1):
if i=1:
x=1
if i=2:
x=2
if i=3:
x=3
s=s+x
return s
print(f())
34. 可以统计字符串、列表、元组、字典等内某元素个数的Python内置函数是index()。
35. 判断下列代码的正确与错误。
def f(a,b,c):
print(a+b,b,c-a)
f(8,b=2,6)
运行上述程序段,结果为10 2 -2。
三、编程题(共3题,共30分)
36. 质数是一个大于1的自然数,除了1和它本身外,不能被其他自然数整除。下面的程序设计中,先自定义一个函数,用来判断一个数是否为质数。然后,通过键盘输入一个数,调用所编写的函数,判断该输入的数是否为质数。请根据上述设计思想,完成程序段中划线处的填空。
def findprime(m):
for i in range(2,m):
if _______①:
return False
else:
return ________ ②
n = int(input('请输入一个数:'))
if _______③:
print("该数是质数.")
else:
print("该数不是质数.")
37. 随机生成的10个在[1,100)范围内整数存入列表;输入一个待查找的整数k,运用二分法在列表中查找k,根据查找状态输出对应的结果,请将程序补充完整。
from random import randint
def b(s,v):
top=0
last=len(s)
while①_
mid=(top+last)//2
if v==s[mid]:
return mid
elif v>s[mid]:
②_
elif v<s[mid]:
last=mid-1
return None
s=[randint(1,100) for i in range(10)]
s.sort()
print(s)
k=int(input())
ans=b(s,k)
if ③_
print('找到,下标是:',ans)
else:
print('没有找到这个数!')
运行结果1:
[13, 25, 27, 41, 52, 66, 67, 69, 72, 75]
72
找到,下标是: 8
运行结果2:
[9, 15, 16, 19, 27, 31, 43, 64, 84, 93]
20
没有找到这个数!
38. 有一群兔子,4个4个地数余1个,5个5个地数余2个,9个9个地数余7个,试问兔子有多少只?(请将程序补充完整)
def①
while②
if n%5==2:
break
n+=9
while True:
if ③
break
n+=45
print(n)
f(16)
参考答案及解析:
一、单选题
1. 答案:A
- 解析:递归出口即递归的终止条件,对于自然数1至n求和的递推式转化为递归函数时,当n=1时,和为1,即f(1)=1。
2. 答案:A
- 解析:程序1直接使用等差数列求和公式,时间复杂度为O(1);程序2使用循环逐个相加,时间复杂度为O(n)。所以程序1的算法效率比程序2高。
3. 答案:B
- 解析:要得到“*#*#*”,需要5个字符,即循环5次。- A、3,8:可能,因为 `range(3, 8)` 循环5次。- B、3,7:不可能,因为 `range(3, 7)` 循环4次。- C、9,14:可能,因为 `range(9, 14)` 循环5次。- D、1,6:可能,因为 `range(1, 6)` 循环5次。不可能的选项是 B、3,7。正确答案是 B。
4. 答案:C
- 解析:每个月的兔子数量是由前两个月的兔子数量决定的,即f(n)=f(n-1)+f(n-2)。
5. 答案:B
- 解析:程序中函数不断调用自身来计算阶乘,这是递归算法。
6. 答案:C
- 解析:在一个程序中,函数的定义必须在函数调用之前,否则会报错。
7. 答案:B
- 解析:递归是分治策略的一种具体体现,将大问题分解为小问题,通过解决小问题来求解大问题。
8. 答案:B
- 解析:分治算法要求问题可以分解为若干个规模较小的相同问题,而不是不同问题。
9. 答案:D
- 解析:A选项和C选项求的是1*1+1*1*3+1*1*3*5的值;B选项由于t=0,乘以任何数都等于0,所以最终结果为0。
10. 答案:C
- 解析:递归算法通常效率较低,因为可能存在大量重复计算,执行效率不高。
11. 答案:B
- 解析:使用函数的目的不只是减少代码重用,还包括提高代码可读性等;带有默认值的参数必须放在位置参数之后;参数之间用逗号隔开。
12. 答案:B
- 解析:通过逐步计算下一个数,每次增加3,这是递推算法。
13. 答案:B
- 解析:函数 `f` 计算 `a**2 + b` 并返回结果。给定 `a=5` 和 `b=100`,`f(a,b)` 返回 `5**2 + 100 = 25 + 100 = 125`。然后 `c = f(a,b) + b` 计算为 `125 + 100 = 225`。所以正确答案是 B、225。
14. 答案:D
- 解析:使用“pip install wheel”安装wheel,用于离线安装whl文件。
15. 答案:C
- 解析:函数show接收一个可迭代对象作为参数,选项C直接传入两个数字,不是可迭代对象,会报错。
16. 答案:B
- 解析:函数 `demo` 将列表 `lst` 从索引 `k` 开始的部分和之前的部分拼接。对于 `lst = [1,2,3,4,5,6]` 和 `k = 4`,结果是 `[5,6] + [1,2,3,4]`,即 `[5,6,1,2,3,4]`,所以答案是 B。
17. 答案:A
- 解析:“二分法”是分治算法的一种具体应用。
18. 答案:D
- 解析:“from math import *”导入了math模块中的所有内容,包括pi常量,在提示符下输入pi可以得到数值3.141592653589793。
19. 答案:D
- 解析:函数do计算1-1/3+1/5-1/7+1/9的值。
20. 答案:B
- 解析:Python定义函数时不需要声明形参类型。
21. 答案:D
- 解析:分治法解决问题的步骤包括分解、求解、合并。
22. 答案:A
- 解析:函数中没有返回值,默认返回None。
23. 答案:C
- 解析:round(3.176)返回3;abs(-3)返回3;ord('3')返回51;len([1,2,3])返回3。
24. 答案:A
- 函数名必须以字母或下划线开头,可以包含字母、数字和下划线。选项B以数字开头错误;选项C是关键字不能作为函数名;选项D以数字开头错误。
25. 答案:A
- 函数pic将整数a与字符串b重复拼接,然后输出并返回结果。调用pic(5,’*#*’)得到*#**#**#**#**#*。
二、判断题
26. 答案:对
- 递归方法可以简化主程序设计,减少代码量,但可能会导致效率问题。
27. 答案:对
- Python定义函数时不需要声明返回值类型,可以根据函数体中的return语句确定返回值类型。
28. 答案:对
- Python具有良好的扩展性,可以通过模块和包管理器来安装和使用第三方库。
29. 答案:错
- 算法执行时间的增长率和问题规模的增长关系,称为时间复杂度;空间复杂度是指算法在运行过程中占用的存储空间与问题规模的关系。
30. 答案:错
- 还需要满足一个条件:不能无限制地调用本身,须有个出口,化简为非递归状况处理。
31. 答案:对
- 分治算法的关键在于能否利用子问题的解合并得到原问题的解。
32. 答案:对
- 该语句通过ASCII码值的计算实现了大写英文字母后移一位的功能。
33. 答案:错
- 程序中if语句的判断应该使用“==”而不是“=”,程序存在语法错误。
34. 答案:错
- 可以统计字符串、列表、元组等内某元素个数的Python内置函数是count(),index()是用于查找元素在列表中的位置。
35. 答案:错
- 函数调用时关键字参数应该在位置参数之后,正确的调用方式是f(8,2,6)。
三、编程题
36.参考答案:
① m % i ==0 (3分)
② True (3分)
③ findprime(n) (4分)
①一个数m如果不是质数,那么必然存在一个大于等于 2 且小于m的数i能整除m。所以①处应填m % i == 0,即如果m能被i整除,则返回False,表示不是质数。
②当循环结束都没有找到能整除m的数时,说明m是质数。所以②处应填True。
③这里是调用函数判断输入的数n是否为质数。所以③处应填findprime(n),如果函数返回True,则表示输入的数是质数,输出相应信息,否则表示不是质数。
试题解析:
def findprime(m):
for i in range(2,m):
if m % i==0:
return False
else:
return True
n = int(input('请输入一个数:'))
if findprime(n):
print("该数是质数.")
else:
print("该数不是质数.")
37.参考答案:
①top<last:或等效答案;(2分)
②top=mid+1或等效答案;(3分)
③ans!=None: 或等效答案;(3分)
①二分查找的条件是查找范围的上界last大于下界top,只要这个条件满足,就继续进行查找。所以①处应填top < last。
②当要查找的值v大于中间值s[mid]时,说明要查找的值在中间值的右边,需要更新查找范围的下界top。所以②处应填top = mid + 1。
③如果找到了要查找的值,函数b会返回对应的下标,否则返回None。所以③处应填ans!=None。
试题解析:
参考答案:
from random import randint
def b(s,v):
top=0
last=len(s)
while top < last:
mid=(top+last)//2
if v==s[mid]:
return mid
elif v>s[mid]:
top=mid+1
elif v<s[mid]:
last=mid-1
return None
s=[randint(1,100) for i in range(10)]
s.sort()
print(s)
k=int(input())
ans=b(s,k)
if ans!=None:
print('找到,下标是:',ans)
else:
print('没有找到这个数!')
38.参考答案:
① f(n):或等效答案;(4分)
② True:或等效答案;(4分)
③ n%4==1:或等效答案;(4分)
试题解析:
① f(n):这里定义了一个函数名为`f`,接受一个参数`n`。这样在函数内部可以使用这个参数进行后续的计算和操作。函数的目的是通过逐步调整`n`的值,找到满足特定条件的兔子数量。
② True:在这个循环中,只要条件不满足就会一直循环下去。这里使用`True`作为循环条件,意味着循环会一直进行,直到通过`break`语句跳出循环。在循环内部,每次不满足条件时就将`n`增加 9,直到找到满足“5 个 5 个地数余 2 个”这个条件为止。
③ n%4==1:在已经满足“5 个 5 个地数余 2 个”的基础上,继续检查是否满足“4 个 4 个地数余 1 个”这个条件。如果满足这个条件,就跳出循环,说明找到了同时满足三个条件的兔子数量。如果不满足,就继续增加 45(4、5、9 的最小公倍数)进行下一轮检查。
参考答案:
def f(n):
while True:
if n%5==2:
break
n+=9
while True:
if n%4==1:
break
n+=45
print(n)
f(16)
学科网(北京)股份有限公司
$$