一组一直成立另一组就破

还是 best = 0 那一版。看看不变式在两个数组上分别第几轮开始不成立(一直成立就给 0),输出如 0/1。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

交付初始化保持终止

把不变式证明的三步各写成一次检查,三个结论一起输出,如 过/过/过。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

数学归纳法的两步是什么

第 1 步:左右两半都已排好 第 2 步:取较小的 13 放下去 第 3 步:取较小的 15 放下去 第 4 步:取较小的 17 放下去 第 5 步:取较小的 23 放下去 第 6 步:右边空了,左边还剩一个 第 7 步:剩下的也要接上,一

开始练习 →

递归的基线对应哪一步

一个递归函数里的基线条件,对应归纳法的【0】。

开始练习 →

归纳假设可以假设什么

证归纳步的时候,你可以放心假设【0】。

开始练习 →

错的那版在有序输入上

下面 msort_bad 漏了合并的最后一句。先拿最顺手的测试用例——已经排好序的数组——试试: #include <algorithm> #include <iostream> #include <strin

开始练习 →

换一个输入它就露馅了

同一个 msort_bad,换成 {0, 1, 2, 4, 3}。程序原样运行(不要修它),输出什么? #include <algorithm> #include <iostream> #include <st

开始练习 →

把合并的最后一步补上

补全归并的收尾——循环出来时,两边一定有一边还剩着。补全后排 {0, 1, 2, 4, 3}。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

错的那版有几种照样对

把五个元素的全部 120 种排列都喂给 msort_bad,数一数有多少种它照样给出了正确结果,输出如 n/120。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

交付基线归纳步不丢元素

把归纳证明的三件事各写成一次检查:基线(长度 0 和 1)、归纳步(拿 {1,4,6} 和 {2,3,5} 两个排好的半边合并)、不丢元素(排 {0,1,2,4,3} 之后还是那五个数)。输出如 过/过/过。 (本题用 g++ -std=c

开始练习 →