2015-01-27 3 views
0

У меня есть следующий код, чтобы полностью изменить цифры в целом:Loop инвариантного (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, для каждой итерации я просто не вижу, что будет здесь. Советы будут оценены.

+2

Кажется, ваш профессор хочет, чтобы вы использовали другой цикл, например, комментарий выше цикла дает намек на цикл. –

+0

Комментарий был моим; мой профессор уточнил, что мы должны использовать цикл while, чтобы написать это. Как насчет комментария указывает, что это должен быть цикл for? – user2049004

ответ

0

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

+0

Это было мое первоначальное предположение, но это показалось немного тривиальным. Это обычно так? – user2049004

+0

Инвариант цикла - это некоторое условие, которое выполняется для каждой итерации цикла. В вашей петле предикат reverse> = 0 является инвариантом цикла, потому что он всегда всегда. –

+0

Теперь ясно? –

0

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

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

number * 10 + reverseNum(reversed) 

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^