создание нескольких вложенных циклов

Я пытаюсь понять, как эффективно вычислить все числа, которые могут быть получены как линейная комбинация некоторого набора, скажем, первых нескольких обильных чисел (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;}


}

person emschorsch    schedule 25.12.2011    source источник


Ответы (1)


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

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

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;
}

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

person Bill    schedule 25.12.2011
comment
Вау, ты, наверное, должен был подумать об этом. Я использую С++ кстати. Я думаю, что мне, возможно, придется пересмотреть мой подход. Поскольку я чувствую, что рекурсия может быстро выйти из-под контроля. - person emschorsch; 25.12.2011
comment
Вау, я только что понял, что неправильно понял вопрос о проекте Эйлера, поэтому я подумал, что вопрос был невероятно сложным. Lol вопрос, как я теперь понимаю, кажется почти тривиальным. Мне нужно только найти числа, которые могут быть выражены как сумма двух чисел, не более того, и они не включают кратные этим числам, что значительно упрощает все. В любом случае спасибо за вашу помощь. - person emschorsch; 25.12.2011
comment
Просто интересно, можно ссылку на вопрос? Спасибо! - person Bill; 26.12.2011
comment
projecteuler.net/problem=23. Наслаждаться! Я сильно пристрастился к этому сайту, и я действительно думаю, что он помогает мне разрабатывать методы построения алгоритмов. - person emschorsch; 26.12.2011