Форум: "Основная";
Текущий архив: 2003.04.21;
Скачать: [xml.tar.bz2];
ВнизКак сделать выборку всех вариантов из списка из M элементов? Найти похожие ветки
← →
BetMaster (2003-04-08 08:09) [0]Как сделать выборку всех вариантов из N элементов из списка состоящего из М элементов?
Например
Есть список чисел 1,2,3,4
Надо выбрать из него по 2 элемента
то есть 12,13,14,23,24,34.
Подскажите пожалуйста.
← →
MBo (2003-04-08 08:11) [1]два вложенных цикла.
← →
BetMaster (2003-04-08 08:19) [2]Я так делал
но почему-то не получилось на больших значениях
например из 20 по 7
← →
MBo (2003-04-08 08:22) [3]это просто очень долго - много вариантов.
два вложенных цикла - это для выборки по 2 элемента, в общем случае - рекурсия.
← →
BetMaster (2003-04-08 08:28) [4]пожалуйста, если не трудно
набрасай примерно код
а то когда я через рекурсию пробовал у меня всё время какая-то ошибка вылетает
← →
MBo (2003-04-08 08:30) [5]Я считаю, что такие вещи надо делать самостоятельно.
← →
Johnmen (2003-04-08 09:43) [6]>MBo © (08.04.03 08:30)
Верно подмечено !
Еще скажу, что можно без рекурсии...
← →
BetMaster (2003-04-08 10:08) [7]Johnmen
Как,если не секрет?
Вот пример выбора по 3
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
res:string;
begin
for i:=0 to memo1.Lines.Count-1 do
for j:=i+1 to memo1.Lines.Count-1 do
for k:=j+1 to memo1.Lines.Count-1 do
begin
res:=(memo1.Lines.Strings[i]+" "+memo1.Lines.Strings[j]+" "+memo1.Lines.Strings[k]);
memo2.Lines.add(res);
end;
end;
Может мне всё таки кто-нить скажет как сделать для любого количечтва через рекурсию
ну или без ней
← →
MBo (2003-04-08 10:16) [8]только hint - ни к чему постоянно обращаться к свойствам Memo.
Держи все в переменных.
← →
BetMaster (2003-04-08 10:44) [9]но мне надо вводить различные слова в качестве членов списка а потом куда-то выводить варианты выборки
и кстати то что я пытался сделать вчера вообще не рекурсия а хз.
щас нашёл что такое рекурсия, и как сделать это с её помощью не догоняю
← →
Cobalt (2003-04-09 00:52) [10]Подсказка - попробуй рассказать последовтельность действий так, как будто это ты сам проходишь по списку, и выбираешь. Очень помогает понять, как строить алгоритм. Например:
берем 1-ый элемент,
прибавляем к нему 2-й
готово - 2 элемента.
прибавляем к 1-му 3-ий - готова вторая комбинация
прибавляем к 1-му 4-ий - готова третья комбинация
....
(в общем случае - прибавляем к нему очередной, +очередной +... до тех пор, пока не наберется нужное количество символов)
← →
Спрашивающий (2003-04-09 03:28) [11]Согласен с MBo © решение таких простых
задач нужно искать самому
Просто было время набрасал за 2 минуты, думаю багов нет
(не проверял.)
procedure TForm1.Button1Click(Sender: TObject);
var
S:String;
J:Integer;
begin
S:=Edit1.Text;
repeat
For J:=2 To Length(S)Do
Memo1.Lines.Add(S[1]+S[J]);
Delete(S,1,1);
until Length(S)=1;
end;
← →
BetMaster (2003-04-09 07:38) [12]Cobalt
да я это понял и написал код для этого выше
проблема в том что при таком варианте по сколько выбирать задаётся в design-time
а мне нужно чтобы я мог в режиме run-time указать по сколько выбирать(например введя число выборки в поле Edit)
Спрашивающий
то что ты написал работает только для выборки по 2
как и в том коде что я привёл выше(тока там по 3)
проблема в том что для изменения степени выборки приходиться в код добавлять новую переменную и цикл.
All
Ну скажите кто-нибудь как это через рекурсию сделать.
← →
Cobalt (2003-04-09 10:21) [13]2 BetMaster
Так в том-то и заключается вся суть работы программиста - самому найти решение(тем более, алгоритмическое), хотя бы по аналогии...
(в общем случае - прибавляем к нему очередной, +очередной +... до тех пор, пока не наберется нужное количество символов) - это и есть рекурсия (очередной ты получаешь вызывая ту же функцию, но с несколько другими параметрами. А еще вероятнее, лучше будет хранить в глобальной переменной, или передавать в параметрах новой функции "предыдущую строку" - это проще, легче и удобней.)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.04.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c