You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

验证数组首元素计数程序的循环不变式是否合理

分析你的循环不变式候选

首先得说,你的核心方向完全没问题——这个程序确实是统计数组a中a[0]的出现次数,你围绕“m和a[0]出现次数的对应关系”来设计循环不变式,思路是对的。但你当前提出的候选不变式:

|{i: 0 <= i <= n and a[0] == a[i]}| = m

是不合理的,问题出在范围描述错误。

咱们拆解一下循环的执行过程:

  • 初始状态:k=a[0],m=1(已经统计了a[0]本身),p=1
  • 循环每次处理的是a[p],处理完后p递增1,直到p >= n时终止

也就是说,在循环的任意迭代中,p的含义是“下一个要检查的元素下标”,此时m实际统计的是0到p-1范围内和a[0]相等的元素个数,而不是整个数组(0到n)的总数。

调整后的合理循环不变式

把范围修正为0到p-1,就可以得到正确的循环不变式:

|{i: 0 <= i < p and a[0] == a[i]}| = m

咱们验证一下这个不变式的三个关键条件:

  1. 初始化:循环开始前p=1,此时集合是{i:0<=i<1}也就是{0},大小为1,正好等于m=1,成立。
  2. 保持:假设某次循环前,不变式对p=q成立(即m是0到q-1中a[0]的个数)。进入循环后:
    • 如果a[q] == a[0],m加1,然后p变成q+1,此时m是0到q中a[0]的个数,符合不变式;
    • 如果a[q] != a[0],m不变,p变成q+1,m仍然是0到q中a[0]的个数,也符合不变式。
  3. 终止:循环终止时p=n,此时不变式变为|{i:0<=i<n and a[0]==a[i]}|=m,也就是整个数组中a[0]的出现次数,和程序返回的结果完全一致。

所以说,你的思考方向非常正确,只是在描述统计范围时出现了偏差,修正范围后就能得到合理的循环不变式了。

内容的提问来源于stack exchange,提问作者Paweł

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:22:01