//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, n с удаленными крайними правыми цифрами d идентичен val. (Предположим, что для записи числа 0 требуется 0 цифр, и это единственное число, для записи которого требуется 0 цифр).
Докажите по индукции, что инвариант цикла верен.
Я всегда думал, что доказательство с помощью индукции предполагает, что при замене переменной в уравнении на k будет истинным, тогда я должен доказать, что k + 1 также будет истинным. Но на самом деле в этом вопросе мне дается не уравнение, а просто блок кода. Вот мой базовый вариант:
Непосредственно перед оценкой защиты от петель в строке 3 значение d равно 0, а в строке 2 - val == n, поэтому, если у n удалена крайняя правая цифра 0, это будет val. Следовательно, базовый случай имеет место.
Я не совсем уверен, как написать индуктивный шаг после этого, так как я не уверен, как доказать k + 1 ..