image

编辑人: 浅唱

calendar2025-05-19

message4

visits824

2023月12月Python四级实操答案及解析

一、编程题

1、36.统计高分问题
小张在学习对分查找后,想利用该思路来实践一下,加深对该算法的理解。于是他按老师的要求,统计期末考试成绩,总分比他高的同学有多少个?
他的思路是,首先将全区所有学生的成绩降序排序,然后利用对分查找思想解决。他编写的代码如下,请完善划线处的代码。
cj =[654,643,621,612,609,606,...]#学生成绩存列表cj并已经降序排序
def dfsearch(key):
i =0; j=len(cj)-1
while i<=j:
m =(i+j)//2
if cj[m]>key:

else:
j-= 1
return ②
key = int(input('输入待查找的成绩'))
pos = ③
print('高于',key,'分的人数有',pos)

参考答案:1. ①处应填:i = m + 12. ②处应填:return j3. ③处应填:dfsearch(key)

解析:【喵呜刷题小喵解析】:

这道题目考查了对分查找算法的应用。小张想要统计全区成绩比自己高的学生数量,可以首先对成绩进行降序排序,然后利用对分查找的思想,从列表的中间位置开始查找,如果中间位置的成绩大于自己,那么说明自己之前的所有学生成绩都大于自己,只需要返回j(即中间位置)即可;如果中间位置的成绩小于自己,那么说明自己之前肯定没有比自己高的成绩,那么自己应该在中间位置之后的位置,于是可以将搜索范围缩小到中间位置的右边,重复以上步骤。

所以,根据以上思路,我们可以得出以下代码:


```python
cj =[654,643,621,612,609,606,...] #学生成绩存列表cj并已经降序排序
def dfsearch(key):
i =0; j=len(cj)-1
while i<=j:
m =(i+j)//2
if cj[m]>key:
i = m + 1 # 如果中间位置的成绩大于key,将搜索范围缩小到m的右边
else:
j-= 1 # 如果中间位置的成绩小于key,将搜索范围缩小到m的左边
return j # 最终返回j,即成绩大于key的最后一个位置,也就是成绩大于key的学生数量

key = int(input('输入待查找的成绩'))
pos = dfsearch(key)
print('高于',key,'分的人数有',pos)
```
其中,①处应填:i = m + 1,表示将搜索范围缩小到m的右边;
②处应填:return j,表示返回成绩大于key的最后一个位置,也就是成绩大于key的学生数量;
③处应填:dfsearch(key),表示调用函数进行对分查找。

2、37.比岁数问题
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。
最后问第一个人,他说是10岁。请问第五个人多大?
请运用递归算法完成以下代码。
def age(n):
​ if ① :
​ c = 10
​ else:
​ c = ②
​ return c
print(age( ③ ))

参考答案:```pythondef age(n):if n == 1:c = 10else:c = age(n-1) + 2return cprint(age(5))```

解析:【喵呜刷题小喵解析】:

在这个问题中,第五个人比第四个人大2岁,第四个人比第三个人大2岁,以此类推。第一个人是10岁,这是已知的。我们需要找出第五个人的年龄。

在这个情况下,递归是一个很好的选择。递归函数会重复调用自己,每次调用时,参数的值都会改变,直到满足某个终止条件。在这个问题中,终止条件就是n等于1,因为第一个人是10岁。

在Python中,递归函数可以像这样编写:

```python
def age(n):
if n == 1:
c = 10
else:
c = age(n-1) + 2
return c
```

在这个函数中,如果n等于1,函数返回10(因为第一个人是10岁)。否则,函数返回age(n-1) + 2,其中age(n-1)是前一个人的年龄,加2是因为题目中说每个人都比前一个人大2岁。

最后,我们调用函数age(5),打印出第五个人的年龄。

3、38.数学证明问题
上世纪中期,校园里流行一种数学游戏,其规则十分简单:任意取一个自然数,若它是奇数,则把它乘以3加上1,若它是偶数,则除以2。按此规则进行下去,经过若干步的计算就能得到自然数1。这个数学现象至今都没有得到完全的证明,但是可以编程来验证它的正确性。
实现上述功能的部分程序代码如下,请补充完成空白处的内容。
step = 1
midlist = []

def subwork(n):
​ global step
​ if n == 1:
​ return step
​ elif n % 2 == 0:
​ n = ①
​ midlist. append(n)
​ step += 1
​ subwork( ② )
​ return step
​ elif n % 2 != 0:
​ n = ③
​ midlist. ④
​ step += 1
​ subwork( ⑤ )
​ return step

cur_num = int(input("请输入一个数字:"))
subwork(cur_num)
print(midlist)
print(step)

参考答案:① n = n / 2② n // 2③ n = 3 * n + 1④ append(n)⑤ n // 2

解析:【喵呜刷题小喵解析】:

根据题目描述,这是一个数学游戏,其规则是:任意取一个自然数,若它是奇数,则把它乘以3加上1,若它是偶数,则除以2。我们需要补充完成空白处的内容,以完成这个数学游戏的程序实现。

1. 对于偶数的处理:


* 偶数除以2得到一个新的偶数,所以需要补充的是`n = n / 2`。
* 将新的偶数添加到`midlist`列表中,即`midlist.append(n)`。
* 递归调用`subwork`函数,并传入新的偶数,即`subwork(n // 2)`。
2. 对于奇数的处理:


* 奇数乘以3再加上1得到一个新的奇数,所以需要补充的是`n = 3 * n + 1`。
* 将新的奇数添加到`midlist`列表中,即`midlist.append(n)`。
* 递归调用`subwork`函数,并传入新的奇数,即`subwork(n)`。

根据以上分析,我们补充了空白处的内容,完成了这个数学游戏的程序实现。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2023月12月Python四级实操答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share