создание нескольких вложенных циклов - PullRequest
0 голосов
/ 25 декабря 2011

Я пытаюсь выяснить, как эффективно вычислить все числа, которые могут быть получены в виде линейной комбинации некоторого множества, скажем, первых нескольких чисел (12,18,20,24). Проблема в том, как я сейчас хочу подойти к этому, чтобы пройти все числа a * 12 + b * 18 + c * 20 + d * 24, где общая сумма не превышает 100. Теперь я подумал о двух способах. Множественно вложенный цикл while или один цикл while, которые увеличивают различные значения на основе условия в верхней части цикла while. Моя проблема с обоими методами состоит в том, что я не знаю, сколько условных или вложенных циклов мне понадобится до времени выполнения, так как я еще не знаю, сколько разных чисел я собираюсь суммировать. Есть ли способ написать мою программу так, чтобы ее n раз для n чисел или чтобы n условий для n чисел.

Вот схема блока переключателей:

int count=1;
while(true){
    if(num2<smal){
        switch(count){
        case 1:
            a++;
            break;
        case 2:
            b++;
            break;
        case 3:
            c++;
            break;
        case 4: 
            d++;
            break;
      }
    }
    else {
        switch(count){
        case 1:
            if(a!=0){
                a=0;
                b++;
            }
            else{count++;}
            break;
        case 2:
            if(b!=0){
                b=0;
                c++;
                count--;
            }
            else{count++;}
            break;
        case 3:
            if(c!=0){
                c=0;
                d++;
                count--;
            }
            else{count++;}
            break;
        case 4: 
            break;
      }
  }
  //num is update here
  if(count==4){break;}


}

1 Ответ

0 голосов
/ 25 декабря 2011

Я не знаю, какой язык вы используете, но если вы не знаете, сколько уровней вам нужно пройти, вам следует подумать о рекурсии (если не сотни или тысячи;взорвать стек).

Если вы не знакомы с рекурсией, то там, где у вас есть вызов функции.Вот глупый пример.

Result doStuff(Stuff stuff, int level) {
    SubResult sr = null;
    if(stuff > 0) {
        sr = doStuff(stuff, level -1);
    }
    Result r = interesting_calculation(stuff, sr);
    return r;
}

Рекурсия может быть хитрой, но иногда это правильный инструмент для работы.

...