Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Вложенные циклы


Автор: r_t 3.12.2004, 11:29
Доброго времени суток.

Подскажите, как сделать так, чтоб при одном запуске программы кол-во вложенных циклов в функции, к примеру было 3, а в следующий раз - 5? Т.е. кол-во вложенных циклов - величина переменная.
Код не нужен, нужен алгоритм.

Автор: ~FoX~ 3.12.2004, 11:49
r_t
Если количество циклов конечно, то придется процедура писать отлельно для каждого количества циклов. Или пиши самомодифицырующийся код.

Автор: r_t 3.12.2004, 12:00
А если сохранять значения переменных в массиве? Меньше 3 циклов не будет, будет только больше.
Т.е.

for i:=0 to n do
for i2:=0 to n2 do
for i3:=0 to n3 do
if <Кол-во циклов> >3 then
for a:=<Значение из массива> to an do ...

В переменную <а> подставлять разные значения из массива и тем самым будет выполняться новый цикл.
По такой схеме это реально реализовать?

Автор: Dimich 3.12.2004, 12:03
А рекурсию использовать?

Автор: r_t 3.12.2004, 12:04
Или, если кто знает, подскажите вариант с рекурсивной функцией.

Автор: maxim1000 3.12.2004, 12:08
можно сделать свой счетчик - объект, который имеет функцию увеличения и функцию проверки окончательного условия, в полях этого объекта будет массив из стольки счетчиков, сколько нужно (динамический), при увеличении сложного счетчика будет увеличиваться младший счетчик, если он дошел до конца - перевод на начало и увеличение следующего, и т.д.
цикл в этом случае будет один, но по сложному счетчику (с помощью while)

Автор: r_t 3.12.2004, 12:29
maxim1000
Звучит сложновато, но попробую.


Dimich
А нельзя ли немного разъяснить, что должно быть в теле этой функции, что передавать в качестве параметров?

Автор: BSV_Sergey 3.12.2004, 12:56
Я не знаю что планируется сделать в конечном цикле, но если предположить, что в каждом из циклов I изменяется от 0 до заданного числа то алгоритм может выглядеть примерно так:
Код

Function Cycle (iNom:Integer; iLength:integer):Integer;
Var i:integer;
  Begin
     iNom := iNom – 1;
     if iNom >= 0 then
        For i:=0 to iLength do
            If iNom > 0 then
                Cycle(iNom,iLength)
            Else
                Form1.iResult := Form1.iResult +1;
  End;
Пример вызова
Cycle(2,2);


iResult – глобальная переменная.
iNom – количество циклов
iLength - Длина цикла
Если в последнем цикле нужно знать текущее значения i в каждом из предшествующих циклов то алгоритм нужно будет усложноть. Но идея думаю понятна

Автор: r_t 3.12.2004, 13:14
BSV_Sergey

Спасибо, немедля попробую реализовать.

Автор: BSV_Sergey 3.12.2004, 14:37
Всегда рад помоч. smile

Автор: SlaUr 6.12.2004, 09:59
По моему проблемма надуманная и ее можно решить по другому.
Подробнее напишите что нужно.

Автор: Bes 11.12.2004, 13:49
По-моему вариант с рекурсией самый оптимальный, ты лучше подумай, как ты будешь определять который раз у тебя прога запустилась. :-) А вообще для каких целей, если не скрет конечно.... :-)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)