Форум: "Основная";
Текущий архив: 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