2013-09-16 3 views
0

Я пытаюсь сравнить значения, используя таблицу «charms», но мои внешние 3 петли регистрируют только первую итерацию; только самый внутренний цикл сравнивает все значения.Вложенные петли останавливаются после первой итерации?

while (m < 17) { 
     while (n < 17) { 
      while (o < 17) { 
       while (p < 17) { 
        number = (Math.pow(w, charms[m])) 
          * (Math.pow(x, charms[n])) 
          * (Math.pow(y, charms[o])) 
          * (Math.pow(z, charms[p])); 
        if (Math.abs(cons - number) < Math.abs(cons - closest)) { 
         closest = number; 
         a = charms[m]; 
         b = charms[n]; 
         c = charms[o]; 
         d = charms[p]; 
        } 
        p++; 
       } 
       o++; 
      } 
      n++; 
     } 
     m++; 
    } 
+0

Какие диагностические меры вы предприняли? Каковы начальные значения 'm',' n', 'o' и' p'? Есть ли исключение? В принципе, здесь слишком мало информации, чтобы помочь вам. –

+0

Не следует ли изменить это на цикл while, который инкапсулирует все эти значения? Я имею в виду, что (m <17 && n <17 && o <17 && p <17) вместо этой гигантской вещи? – Katana24

+3

Когда 'p == 17', он никогда не возвращается к исходному значению, которое у него было. Внешние петли бесполезны после первого запуска. – agbinfo

ответ

4

Прежде всего, вы не показываете, как вы инициализируете m, n, o and p. Во-вторых, вы не сбрасываете счетчики в любой момент. Как только вы пройдете через самый внутренний цикл один раз, вы никогда не пройдете его снова, так как p будет больше или равно 17 после этого. Затем, как только o достигнет 17, вы больше никогда не войдете в этот цикл и так далее.

+0

Спасибо, я не могу поверить, что забыл сделать что-то такое простое. – user2785277

+0

@ user2785277 Я программировал в течение 36 лет, и иногда я делаю такие вещи. Фактически, я поймал один только на прошлой неделе, когда я забыл что-то увеличивать в цикле 'while'. – ajb

0

Было бы полезно знать, что начальные значения m, n, o и p являются, и какие значения charms являются. Но есть простая причина, по которой это не сработает: Скажем m, n, o и p все установлены в 1 перед циклом. Затем внутренний цикл выполняется и завершается, когда p равно 17. Итак, вы увеличиваете o и начинаете этот цикл, но что такое p? Это все еще 17! Он никогда не возвращается к 1 или что-то еще. Таким образом, ни один из кода в самой внутренней петле никогда не повторяется.

По крайней мере, вам нужно сбросить каждую переменную перед вами петли на нем:

while (m < 17) { 
    n = 1; // or whatever, you haven't told us what it's supposed to start at 
    while (n < 17) { 
     o = 1; 
     while (o < 17) { 
      p = 1; 
      while (p < 17) { 

или даже лучше, используйте for петли, которые ставят логику инициализации, тестирования и приращение все в одном месте.

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