Инвариант цикла (java)

У меня есть следующий код для изменения цифр в целом числе:

public class integerReversal {
    public static int reverseNum(int number){
        int reversed = 0;
        int remainder;
        //{I:  ; B: number > 0}
        while (number > 0){
            remainder = number % 10;
            number = number / 10;
            reversed = reversed * 10 + remainder; 
        }
        //{I: ; !B: number == 0}
    return reversed;
    }
    public static void main (String [] args){ 
        System.out.println(reverseNum(1262015 ));
    }
}

Мой профессор поручил нам написать этот код, а также сказал написать инвариант цикла и условие цикла. Я понимаю условие цикла здесь, я просто не уверен, что мне следует искать для инварианта. Я понимаю, что это какое-то условие, которое будет истинным в начале и в конце цикла while, для каждой итерации, я просто не вижу, какое оно будет здесь. Советы будут оценены.


person user2049004    schedule 27.01.2015    source источник
comment
Кажется, ваш профессор хочет, чтобы вы использовали другой цикл, например for, комментарий над циклом дает намек на цикл for.   -  person Juned Ahsan    schedule 27.01.2015
comment
Комментарий был моим собственным; мой профессор указал, что мы должны использовать цикл while, чтобы написать это. Что в комментарии указывает на то, что это должен быть цикл for?   -  person user2049004    schedule 27.01.2015


Ответы (2)


В вашем случае reverse >=0 является инвариантом вашего цикла, так как он всегда будет оставаться истинным, независимо от того, нарушаете ли вы цикл или нет.

person Aninda Bhattacharyya    schedule 27.01.2015
comment
Это было мое первоначальное предположение, но оно казалось немного тривиальным. Это обычно так? - person user2049004; 27.01.2015
comment
Инвариант цикла — это некоторое условие, которое выполняется для каждой итерации цикла. В вашем цикле обратный предикат ›= 0 является инвариантом цикла, потому что он всегда истинен. - person Aninda Bhattacharyya; 27.01.2015
comment
Пожалуйста, примите ответ, если он отвечает на ваш вопрос, или дайте мне знать, если у вас есть еще сомнения. Спасибо. - person Aninda Bhattacharyya; 27.01.2015
comment
@AnindaBhattacharyya Боюсь, вы не совсем понимаете инварианты циклов. - person sprinter; 27.01.2015
comment
@sprinter Спасибо за комментарий к моим знаниям, но я считаю, что давайте не будем тратить на это время и энергию, поскольку я хорошо осведомлен о своих знаниях и постараюсь сосредоточиться на наших ответах. - person Aninda Bhattacharyya; 27.01.2015
comment
@AnindaBhattacharyya справедливое замечание. Я пытался сказать, что чувствовал, что ваш ответ вводит в заблуждение, но я согласен, что плохо выразил эту мысль. Я добавил свой собственный ответ, который, по моему мнению, является лучшим выражением инварианта. Похоже, спрашивающий в любом случае потерял интерес! - person sprinter; 27.01.2015

Инвариант цикла — это постоянное выражение, включающее значения, предназначенные для изменения на каждой итерации.

В вашем случае на каждой итерации number — это число без крайней правой цифры, а reversed — это число, которое вы построили из остатков в предыдущих итерациях. Поэтому я считаю, что ответ заключается в том, что на каждой итерации следующее выражение остается постоянным:

number * 10 + reverseNum(reversed)

Другими словами, в любой момент вы можете вернуть исходное число, изменив свое текущее решение на обратное и добавив 10 * текущее число.

Этот тип инварианта очень полезен при тестировании вашего алгоритма — некоторые программисты регулярно включают оператор assert для тестирования этих типов инвариантов.

Инвариантов может быть несколько — в вашем случае остается ряд неравенств, которые остаются верными.

person sprinter    schedule 27.01.2015