У меня есть следующий код:
public static void main(String[] args) {
int a = 3;
int b = 7;
int x = b; // x=b
int res = a; // res = a
int y = 1;
int invariant = 0;
System.out.println("a|b|x|y|res|invariant");
while (x > 0) {
if (x % 2 == 0) {
y = 2 * y;
x = x / 2;
} else {
res = res + y;
y = 2 * y;
x = (x - 1) / 2;
}
invariant = y + 2;
String output = String.format("%d|%d|%d|%d|%d|%d", a,b,x,y,res,invariant);
System.out.println(output);
}
// < res = a + b >
}
Что дает следующий вывод:
a|b|x|y|res|invariant
3|7|3|2|4|4
3|7|1|4|6|6
3|7|0|8|10|10
Однако, если я изменю числа, инвариант больше не будет равен резолюции. Поэтому мой инвариант цикла для этой задачи не верен.
Я изо всех сил пытаюсь найти правильный инвариант цикла и был бы рад, если есть какие-то подсказки, которые кто-то может дать мне.
Мое первое впечатление после изучения кода и моих результатов заключается в том, что инвариант цикла изменяется в зависимости от a и b. Допустим, и a, и b являются нечетными числами, как они есть в моем примере, тогда мой инвариант Loop является правильным (по крайней мере, так кажется)
Правильно ли предположить вариант цикла, подобный следующему?
< res = y - 2 && a % 2 != 0 && b % 2 != 0 >
Я использовал разные числа, и, кажется, каждый раз, когда я меняю их, появляется другой инвариант цикла, и я изо всех сил пытаюсь найти какой-либо шаблон.
Я был бы очень признателен, если бы кто-нибудь дал мне подсказку или общее представление о том, как это решить.
Спасибо