⚠️ 不变式和普通断言差在哪
在循环里随手加一句 assert,和写一个不变式的区别是【0】。
每一轮的 best 是什么
数组 [17, 24, 15, 13, 23],把每一轮结束时的 best 都打出来: A = [17, 24, 15, 13, 23] NEG = [-17, -24, -15, -13, -23] def find_max(a):
⚠️ 全负数组上,它给出什么
一个常见的写法是 best = 0。拿全是负数的数组 [-17, -24, -15, -13, -23] 跑一遍: NEG = [-17, -24, -15, -13, -23] def find_max_bad(a): best
自己写:把不变式写成一句 assert
数组 [17, 24, 15, 13, 23]。在循环体末尾加一句断言,把"best 是前 i+1 个里最大的"这句话真正验起来,并数一数一共验过几轮。
🔴 一组上一直成立,另一组第一轮就破
还是 best = 0 那一版。看看不变式在 [17, 24, 15, 13, 23] 和 [-17, -24, -15, -13, -23] 上分别第几轮开始不成立(一直成立就给 0)。
交付:初始化 / 保持 / 终止
数组 [17, 24, 15, 13, 23]。把不变式证明的三步各写成一次检查,三个结论一起输出。
数学归纳法的两步是什么
用归纳法证明一件事对所有 n 成立,要走的两步是【0】。
递归的基线对应归纳的哪一步
一个递归函数里的基线条件,对应归纳法的【0】。
⚠️ 归纳假设可以假设什么
证归纳步的时候,你可以放心假设【0】。
错的那版,在已排好序的输入上给什么
下面 msort_bad 漏了合并的最后一句。先拿最顺手的那个测试用例——已经排好序的数组——试试: def msort(a): if len(a) <= 1: return list(a) m = l