![]() |
|
#1
|
|||
|
|||
![]() Здравствуйте!
Не получается у меня следующая задача: есть строка на N символов, набор допустимых символов состоит из M букв (например, 'a, b, c, ...,m'). Как мне в компоненте Memo отобразить все возможные сочетания этих символов в строке без повторов. То есть, примерно так: a...aaa (N штук) a...aab a...aac ......... m...mmm Спасибо. |
#2
|
|||
|
|||
![]() Лень писать код, но примерно алгоритм выглядит так:
1. Забиваем буферную строку 1 первым символом (N штук). вот тебе уже первый элемент. Выводим в Мемо. 2. Забиваем Забиваем буферную строку 2 последним символом (опять N штук). Это конечный элемент. 3. В цикле пока строка 1 не равна строке 2 меняем крайний символ на следующий, с контролем и переносом (т.е. если там уже последний символ, то меняем следующий, а этот сбрасываем в первый). 4. Выводим в Мемо строку 2. Примерно так. При этом смену символа лучше всего сделать отдельной процкой с рекурсией для упрощения кода. |
#3
|
|||
|
|||
![]() Вот с рекурсией у меня и проблема.
Понятно, что менять символ в строке можно с помощью цикла: Код:
For i:=1 to M do begin Stroka[k]:=NaborSimvolov[i]; Memo.Lines.Add(Stroka); end; А вот как осуществлять рекурсию и задавать переменную k, чтобы повторов не было и все сочетания вывелись? Последний раз редактировалось Brute Force, 06.05.2008 в 22:17. |
#4
|
|||
|
|||
![]() Ну, на самом деле это выглядеть должно где-то так (пишу прямо тут, так что за компиляемость не ручаюсь, главное смысл):
Код:
// Где-то описана строка со всеми доступными символами, например, для 3 она будет содержать 'abc' var AllSymbols : String; // процка, делающая замену procedure ChangeSymbol(Idx : Integer; var S : String); var Ch : Char; NextCh : Char; begin // текущий символ в позиции Idx Ch := S[Idx]; // находим следующий символ For I := 1 To Length(AllSymbols) Do If AllSymbols = Ch Then Begin // если он последний, то следующий будет первый, иначе - следующий If I = Length(Allsymbols) Then NextCh := AllSymbols[1] Else NextCh := Allsymbols[I+1]; Break; End; // если символ первый среди возможных, то надо поменять предшествующий - переход позиции If NextCh := AllSymbols[1] Then ChangeSymbol(Idx-1,S); // меняем символ S[Idx] := NextCh; end; ну фактически тебе осталось написать инициализацию всех переменных и выталкивание этого добра в Мемо. |