循环不变这个代码?

时间:2014-07-30 10:16:11

标签: loop-invariant

我读过关于循环不变量的内容,但我有点困惑 假设我有这个代码,不变量是什么?像A + B = X的东西?

    public static void main(String[] args) {
      Scanner scanner = new Scanner(System.in);
      long A = scanner.nextLong();
      long B = scanner.nextLong();

      long resultado = 0;

      for (long i = A; i <= B; i++) {
          resultado += Long.bitCount(i);
      }

      System.out.println(Long.valueOf(resultado));
    }

2 个答案:

答案 0 :(得分:1)

不变量是一种在代码的某些部分始终为真的条件。循环不变是循环内的条件。不变量用于证明程序的正确性。更有用的不变量是正确性证明更强。我用强不变量来表示你的程序,它显示了 resultado 中将收到的程序:

public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  long A = scanner.nextLong();
  long B = scanner.nextLong();

  long resultado = 0;

  for (long i = A; i <= B; i++) {
      resultado += Long.bitCount(i); 
// loop invariants: 
// strong: resultado = A + (A + 1) + ... + i => resultado = (A + i) * (i - A + 1) / 2,
// weak: resultado > A, A <= i <= B
  }

  System.out.println(Long.valueOf(resultado)); //invariants: resultado = (A + B) * (B - A + 1) / 2,  this invariant prooves correctness of the program
}

之后,您可以将其与您的程序规范进行比较,如果运行良好,即使没有运行代码也可以做出决定。

我使用arithmetic progression的公式:formula。在循环结束时,我只是将 i 的最后一个值放在循环不变量中,并在程序结束时接收不变量。

希望我回答你的问题。

答案 1 :(得分:0)

阅读维基百科中的定义,我猜想以下内容:

A <= i <= B
resultado >= 0