证明使用循环不变量的归纳法

时间:2014-04-24 23:18:25

标签: proof induction

//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,我不确定如何写入归纳步骤。

1 个答案:

答案 0 :(得分:0)

除了通过循环的k迭代替换等式中的n值之外,逻辑与方程实际上是相同的:

  1. 基本情况是循环不变量在开始循环之前保持不变;
  2. 你必须证明如果在迭代N之前不变量保持不变,那么在执行迭代N之后它仍将保持。
  3. 从1.和2.我们通过归纳得出结论,不变量在循环结束时(或者在任何迭代结束时,实际上)保持不变。

    编辑,这很有趣,因为循环以val == 0结尾。你的不变量(在循环结束时仍为真)是 n,其最右边的d个数字被移除与val 相同,因此移除了n个数字的d与0相同此时,d正确显示n所需的位数。