//Precondition: n > 0
//Postcondition: returns the minimum number of decial digits
// necessary to write out the number n
int countDigits(int n){
1. int d = 0;
2. int val = n;
3. while(val != 0){
4. val = val / 10; // In C++: 5 / 2 === 2
5. d++;
6. }
7. return d;
}
不变量:就在第 3 行评估循环保护之前,删除了最右边的 d 位的 n 与 val 相同。(假设数字 0 需要 0 位来写出,并且是唯一需要 0 位来写出的数字)。
使用归纳法证明循环不变量成立。
现在我一直认为归纳证明是假设通过用 k 替换方程中的变量将是真的,那么我必须证明 k+1 也将是真的。但是在这个问题中我并没有真正给出方程式,而只是一段代码。这是我的基本情况:
就在第 3 行评估循环保护之前,d 等于 0,在第 2 行,val == n,因此如果 n 删除了最右边的 0 位,则为 val。因此,基本情况成立。
我不确定如何在此之后编写归纳步骤,因为我不确定如何证明 k+1 ..