信息技术选考 · 程序题精讲
2026年6月 第11题有如下Python程序段:
# 随机产生10个互不相等的整数存入列表a,代码略
m, r = 0, 0
foriinrange(len(a)):
ifa[i] < a[m]:
r = i
else:
m = i执行该程序段后,r的值为6,则下列表达式中,值一定为True的表达式:
① a[0] < a[6]
② a[6] < a[5]
③ a[6] < a[7]
A. 0 B. 1 C. 2 D. 3
第一步,寻找变量。在第一行有两个变量 m 与 r,在 for 循环中有循环变量 i,另外有列表 a 的变量。
第二步,观察结构。结构为典型的循环中套有分支的结构类型。所以,如果是运行代码的话,我们只需要记录 m、r、i 三者的变量关系即可,其中 i 是一直往后走的。
第三步,挖掘逻辑与变量之间的关系。明显我们这里是双指针对应的数值比较,即有 i 和 m 两个索引,比对两个索引所对应的数值大小。当 i 索引的数值小于 m 索引的数值时,将 r 赋值给 i,也就是 r 跑到了 i 处;否则,m 赋值给 i,也就是 m 跑到了 i 处。(如下图)
注意:题目当中已经明确表述所有元素均不相等,故不用考虑相等的情况。
双指针比较逻辑示意图
第一步,抓住题眼。题目的关键词在于:① r = 6;② 下面的三条表达式一定成立(返回为True)的个数。
第二步,理解表达式。①是第1个元素比第7个元素小,②是第7个元素比第6个元素小,③是第7个元素比第8个元素小。
一般来说,大家在考场上对着代码去直接思考存在一定难度(当然这道题其实比较容易想到,可以不去尝试),所以我们一般先尝试去组一串数字去尝试。
尝试带入因为题目当中说最后 r = 6,所以最后一次运行if a[i] < a[m]: r = i时,i = 6。因此,我们先尝试随意去列 i = 6 前面的数字,然后再考虑特殊问题。
编者这边随意列出的是:16, 29, -6, 2, 7, 21, 6(前7个),然后我们带入运行,发现其实并没有什么异常,最后 i = 6,说明前7次运行结果可以参考以下表格:
逻辑推理我们发现,只需要保证第7次运行结果为 True,就可以达到 r = 6,所以①、②条件是不确定的。
因此,接下来我们只需要做到接下来的运行过程只运行else: m = i即可。因此接下来必须满足条件a[i] > a[m],而 m 的变化是由 i 引起的,因此当未进入 else 时,i 会在 m 的后面。
再加上所有元素均不相等,因此后面一个元素一定会大于前面一个元素(当 i ≥ 7 时),故③第7个元素比第8个元素小成立。
a[6] < a[m] → 走if分支,r = 6必须走else分支(否则 r=7)→ a[7] > a[m]必须走else分支(否则 r=8)→ a[8] > a[7]必须走else分支(否则 r=9)→ a[9] > a[8]i=6 时 a[6] < a[m],i=7 时 a[7] > a[m](同一个 m)
∴ a[6] < a[m] < a[7] →a[6] < a[7] 成立