2013-02-27 2 views
2

Это в Python. Я пытаюсь выяснить, как это работает, поэтому я могу перевести его на Java.Как именно эта сумма работает()?

numInversions = sum(
    state.index(START[j]) > state.index(START[i]) 
    for i in range(16) for j in range(i) # each pair (i,j) 
) 
+0

я довольно много понимаю, кроме как> оператор работает с, результат от него – JRowan

ответ

2

Как это:

numInversions = 0 
for i in range(16): 
    for j in range(i): 
     if state.index(START[j]) > state.index(START[i]): 
      numInversions += 1 

В > возвращает bool, что эквивалентно 0 или 1.

+0

спасибо, что я был так долго, оглядываясь, как сумасшедший, спасибо – JRowan

+0

thats на самом деле то, что я думал, им просто проверять себя, прежде чем я буду кодировать, спасибо снова – JRowan

2

Кодекс похож на расширенном формате

numInversions = = 
for i in range(16): 
    for j in range(i): 
     if state.index(START[j]) > state.index(START[i]): 
      numInversions += 1 

исключением того, что все выражение обернута как выражение генератора и передается на встроенный в сумме

Конструкция вложенного цикла считывается слева направо, так что unfoldes к

for i in range(16): 
    for j in range(i): 

условие, которое вычисляется в булево значение Истина или Ложь суммируется. Таким образом, вы заканчиваете подсчет всех экземпляров, которые условие оценивает до True

2

Внутренний цикл генерирует логические значения (True и False) на основе двух вложенных циклов. IN Python, булевы являются подклассом int и при суммировании действуют как 1 и 0 для True и False соответственно.

Таким образом, вы могли бы переписать это так:

numInversions = 0 
for i in range(16): 
    for j in range(i): 
     if state.index(START[j]) > state.index(START[i]): 
      numInversions += 1 
2

В (псевдо-) Java:

int numInversions = 0; 
for (int i = 0; i < 16; ++i) { 
    for (int j = 0; j < i; ++j) { 
    if (state.index(START[j]) > state.index(START[i])) { 
     ++numInversions; 
    } 
    } 
} 
Смежные вопросы