Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

Вложеные циклы   Найти похожие ветки 

 
Avil   (2005-07-09 22:33) [0]

Вот возникла проблема с перебором, немогу понять как выйти из положения, есть в программе перебор 3 х элементов я использовал 3 вложеных цикла:
for i:=1 to 10 do
 for j:=1 to 15 do
    for k:=1 to 13 do
       m:= i+j+k;

но теперь появилась необходимость изменять количество элементов (т.е. циклов), например сделать 4 вложения...

В интернете нашел инфу, что проблема решается рекурсивной функцией, с этим у меня большие проблемы, кроме расчета факториала у меня ничего не получается :) Помогите примерами плиз.


 
sniknik ©   (2005-07-09 22:44) [1]

ни рекурсии ни циклов в твоем случае не нужно
замени свое на
m:= 10 + 15 + 13;
...
и прибавляй далее по значению вместо цикла.


 
avil   (2005-07-09 22:50) [2]

не к сожалению так не получиться :( я слишком упростил пример, там перед i,j,k есть числа

for i:=1 to 10 do
for j:=1 to 15 do
   for k:=1 to 13 do
      m:= 12*i+11*j+17*k;


 
sniknik ©   (2005-07-09 23:03) [3]

да брось ты, не получится ..., проверь
m:= 12*10 + 11*15 + 17*13;
ничуть не хуже твоих циклов.


 
avil   (2005-07-09 23:38) [4]

проверил, m считает, вот только надо еше знать и j,i,k при каждом m, так что вопрос актуален...


 
Anatoly Podgoretsky ©   (2005-07-09 23:56) [5]

Они у тебя константа.


 
Гаврила ©   (2005-07-10 00:00) [6]

Сформулируй задачу, плиз, а то не понятно, что надо.
"Количество циклов" модет быть любым? 3,  4, 28?
Что вообще надо сделать?


 
Германн ©   (2005-07-10 01:20) [7]

Согласен с Гаврила ©   (10.07.05 00:00) [6]

Задача не описана. В изложении и последующем разъяснении сабжа - циклы вообще не нужны. Только время тратят.


 
Юрий Зотов ©   (2005-07-10 01:56) [8]

> Avil   (09.07.05 22:33)

Похоже, что-то вроде этого (внимательно проверьте алгоритм, это не готовый пример, а только его набросок):

const
 MaxLevel = 3;  
 EndValue = array[1..MaxLevel] of integer = (10, 15, 13);

function GetResult(Level: integer): integer;
var
 i: integer;
begin
 if Level < MaxLevel then
   Result := GetResult(Level + 1)
 else
   for i := 1 to EndValue[Level] do
   begin
     ... // Здесь пишем тело "универсального" цикла
   end
end;

Вызов:
 M := GetResult(1);


 
Юрий Зотов ©   (2005-07-10 02:00) [9]

> Avil   (09.07.05 22:33)

Забыл добавить: теперь, если потребуется увеличить число вложенных циклов, нужно будет только исправить значение MaxLevel и добавить в массив EndValue нужные элементы. Сам же код остается без изменений.


 
LF ©   (2005-07-11 14:34) [10]

Avil

В этом случае тебе нужно 10*15*13 = 1950 значений? Я правильно понял?

Есть какая-нибудь зависимость между 10/15/13 и 12/11/17 ?
Или вообще какая-нибудь зависимость?


 
evvcom ©   (2005-07-11 15:13) [11]


> sniknik ©
> Anatoly Podgoretsky ©

:), но верно!


> for i:=1 to 10 do
>  for j:=1 to 15 do
>     for k:=1 to 13 do
>        m:= i+j+k;

Ты ничего не путаешь? Ты вычисляешь на каждом шаге m, а на следующем же его затираешь, так и не использовав. Отсюда и такие ответы про константы, и заметь, верные ответы-то!


 
avil   (2005-07-21 22:36) [12]

извините за нечеткость вопроса и долгое молчание...
да задача состоит в переборе всех возможных вариантов, т.е.
вводиться количетво элементов (циклов например 3) и тогда
конечкая формула: m := i*140 + j*120 + k*130, если введено
элементов 2 то формула будет m := i*140 + j*120,
Все работало когда я заранее знал сколько элементов будет, например точно 3 элемента (цикла)
код был
for i:=1 to 10 do
        for j:=1 to 15 do
         for k:=1 to 13 do
             m := i*140 + j*120 + k*130;
(на самом деле i,j,k изменяются на фиксированую величину, например от 140.1 до 141.1, с шагом 0.1, т.е. это 10 значений 140.1, 140.2, и тд.)
на выходе из циклов я получал матрицу 3х(10*15*13),
вот как рещить задачу с заранее неизвестным количеством циклов?
я решил попробовать так:
А - матрица
a1 - b1 - c1
a2 - b2 - c2
a3 - b3 - c3
все варианты будет матрица 3 на 27 В - матрица
 m:=2; //колонка
 n:=2; //строка
 SetLength(A,n+1,m+1);
 SetLength(B,trunc(intpower(n+1,m+1)),m+1);

 for s:=0 to m do
    for x:=0 to n do
       begin
         z := trunc(intpower(n+1,m-s))*x;
         for i:=0 to trunc(intpower(n+1,s))-1 do
             begin
               for j:=0 to trunc(intpower(n+1,m-s))-1 do B[z+j,s] := A[s,z];
               z := z + trunc(intpower(n+1,m-s+1));
             end;
       end;

и на выходе должно получаться
a1 - b1 - c1
a1 - b1 - c2
a1 - b1 - c3
a1 - b2 - c1
a1 - b2 - c2
a1 - b2 - c3
a1 - b3 - c1
a1 - b3 - c2
a1 - b3 - c3
и т.д., а затем перебираем массивчик и считаем формулу  m := i*140 + j*120 + k*130;

Вот интересно а как можно еще решить эту задачу? Там может рекурсию использовать, но как ранее я писал, кроме факториала ничего с рекурсией у меня неполучается :(
Помогите советом плиз.


 
TUser ©   (2005-07-22 07:41) [13]

псевдокод

var i: integer;
   A: array of integer; // текущие значения счетчиков цикла
   
function Next: boolean;
begin
   // такую ф-ю я только что написал в соседней ветке
   // http://delphimaster.net/view/1-1121894484/
end;

begin
 SetLength(A,сколько надо);
 Vi: A[i]:=0;
 repeat
   // тут твой цикл
 until Next;
end


 
TUser ©   (2005-07-22 07:59) [14]

until not Next, конечно



Страницы: 1 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.04 c
4-1118401293
Андрей Жук
2005-06-10 15:01
2005.08.14
Неверный результат работы функции


3-1120646330
neznayu
2005-07-06 14:38
2005.08.14
хранимая процедура создается из делфи


14-1122031149
Андрей Жук
2005-07-22 15:19
2005.08.14
Аттачменты из аутглюка...


1-1122466911
race1
2005-07-27 16:21
2005.08.14
Буфер обмена


4-1118591508
Asdweb
2005-06-12 19:51
2005.08.14
Как открать файл