![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как организовать цикл?
MVP © (2006-05-15 21:52:00)Цикл такой
for i := 1 to 24 do
for j := 2 to 23 do
for k := 3 to 22 do
Надо чтоб он перебирал все не повторяющиеся значения. К примеру (4 4 3) и (4 3 4 ) - повтор, надо исключить повторы, которые могут получится путем переставления цифр
MBo (2006-05-19 10:14:00) [1]for i := 1 to 6 do
for j := i + 1 to 5 do
for k := j + 1 to 4 do
Сергей М. (2006-05-19 10:06:00) [2]procedure TTestForm.Button3Click(Sender: TObject);
var
i,j,k: Integer;
sl, sl1: TStringList;
begin
sl := TStringList.Create;
sl.Sorted := True;
sl.Delimiter := ' ';
sl1 := TStringList.Create;
sl1.Sorted := True;
sl1.Duplicates := dupError;
for i := 1 to 6 do
for j := 2 to 5 do
for k := 3 to 4 do
if (i = j) or (j = k) or (i = k) then
Continue
else begin
sl.Clear;
sl.add(format('%d', [i]));
sl.add(format('%d', [j]));
sl.add(format('%d', [k]));
try
sl1.Add(sl.DelimitedText);
Memo1.Lines.Add(Format('%d %d %d', [i,j,k]));
except
end;
end;
sl.Free;
sl1.Free;
end;
MVP (2006-05-19 09:12:00) [3]Вот такой цикл
for i := 1 to 6 do
for j := 2 to 5 do
for k := 3 to 4 do
Для него должны быть комбинации
123
124
134
153
154
234
253
254
354
623
624
634
653
654
То есть, нельзя чтоб i=j, j=k, i=k и не допускаются во второй раз комбинации, которые можно образовать перестановкой чисел 334 и 343 не подходят, из них должна быть только одна комбинация не важно какая, лишь бы не было повтора...
Сергей М. (2006-05-18 15:12:00) [4]
> MBo © (18.05.06 13:49) [15]
У Автора синдром Тузика: "Все понимаю, а сказать не могу")
MBo (2006-05-18 13:49:00) [5]>Может кто поможет ))
Вот я, к примеру, до сих пор не понял принципа, по которому формируются комбинации, так что помочь не в силах...
Сергей М. (2006-05-18 13:48:00) [6]Насколько критично время выполнения алгоритма формирования этих "троек" ?
MVP (2006-05-18 13:44:00) [7]Может кто поможет ))
MVP (2006-05-16 23:57:00) [8]Должны быть такие комбинации
123
124
134
153
154
234
253
254
354
623
624
634
653
654
Для того варианта который я написал, это номера ячеек массивов, в которых лежат числа, которые подставляются в такую формулу
Over[Ind]:=ArcTan2((Ts[i]-Ts[k])*(Xs[j]-Xs[i])-(Ts[i]-Ts[j])*(Xs[k]-Xs[i]),
(Ts[i]-Ts[j])*(Ys[k]-Ys[i])-(Ts[i]-Ts[k])*(Ys[j]-Ys[i]));
Leonid Troyanovsky (2006-05-16 21:39:00) [9]
> palva © (16.05.06 21:25) [10]
Третье число по новому условию в диапазоне 3..4
Скорее, это не новое условие, а интерполяция из [0],
т.е., не совсем удачная попытка исключить повторения
за счет сужения границ. IMHO.
--
Regards, LVT.
palva (2006-05-16 21:25:00) [10]> Объясни, почему отвергнуты
Третье число по новому условию в диапазоне 3..4
Leonid Troyanovsky (2006-05-16 21:04:00) [11]
> MVP (16.05.06 20:34) [7]
> сорри, но может кто-то помочь? )
Объясни, почему отвергнуты
1,2,5
1,2,6
1,3,6
1,4,6
1,5,6
2,5,6
и, возможно, что тебя поймут.
--
Regards, LVT.
Loginov Dmitry (2006-05-16 20:50:00) [12]MVP (16.05.06 13:10) [6]
А если так:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,k: integer;
begin
for i := 1 to 6 do
for j := i + 1 to 6 do
for k := j + 1 to 6 do
Memo1.Lines.Add(Format('%d %d %d', [i, j, k]));
end;
MVP (2006-05-16 20:34:00) [13]сорри, но может кто-то помочь? )
MVP (2006-05-16 13:10:00) [14]Я извиняюсь, я немного неправильно поставил вопрос: вообще не должно быть одинаковых чисел в одной комбинации, тоесть (3 2 3) - не подходит (4 4 4) - не подходит, (3 2 4) и (2 4 3) - из таких перестановок должна быть только одна комбинация, все остальные откидываться.
вот что должно быть для такого цикла
for i := 1 to 6 do
for j := 2 to 5 do
for k := 3 to 4 do
Должны браться только такие комбинации
(123), (124), (134), (153), (154), (234), (253), (254), (354), (623), (624), (634), (653), (654)
tesseract (2006-05-16 11:40:00) [15]
> Может его как-то оптимизировать можно?
> SetLength(A, count + 1);
Убери это. Выделение памяти процесс небыстрый. Лучше хапни срзау побольше.
Desdechado (2006-05-16 11:33:00) [16]может, стоит прислушаться к советам?
MVP (2006-05-16 01:09:00) [17]Вот мой вариант, вроде работает.
function Pro (i, j, k : integer):real;
begin
Result := sin(i)*sin(j)*sin(k);
end;
var
i, j , k : integer;
count, nus, schet: integer;
A : array of real;
s : string;
begin
count := 0;
schet := -1;
for i := 1 to 24 do begin
for j := 2 to 23 do begin
for k := 3 to 22 do begin
if (i=j) or (i=k) or (j=k) then continue;
SetLength(A, count + 1);
for nus := 0 to High(A) do
if (A[nus] <> Pro (i, j, k)) then Inc(schet);
if Schet = High(A) then
begin
A[count] := Pro (i, j, k);
s := IntToStr(i) + ' ' + IntToStr(j) + ' ' +
IntToStr(k) + ' ' + FloatToStr(A[count]);
Memo1.Lines.Add(s);
Inc(Count);
schet := -1;
end;
schet := -1;
end;
end;
end;
end;
Может его как-то оптимизировать можно?
Leonid Troyanovsky (2006-05-15 23:50:00) [18]
> MVP (15.05.06 21:52)
for i := 1 to 24 do
for j := 1 to i-1 do
for k := j+1 to i-1 do
--
Regards, LVT.
palva (2006-05-15 23:45:00) [19]
for i := 1 to 24 do
for j := max(2,i) to 23 do
for k := max(3,j) to 22 do