Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.011 c
14-1122048405
PlayBoy
2005-07-22 20:06
2005.08.14
Отличие между поверкой и проверкой?


4-1117047930
XeNoMoRf
2005-05-25 23:05
2005.08.14
Снятие значений с термодатчиков системы


14-1122043981
qt
2005-07-22 18:53
2005.08.14
Программирование дисковода


14-1122043909
Piter
2005-07-22 18:51
2005.08.14
Black Sabbath


14-1122037873
tormoz
2005-07-22 17:11
2005.08.14
Скучно тут у вас!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский