program recursion;
uses crt;
var st:string[32];
original:string[32];
chst:array[1..32] of char;
i,k:byte;
procedure blend(abc:string);
begin
for i:=1 to length(st) do
chst:=st;
for i:=1 to length(st)-1 do begin
insert(chst[i+1],st,i);
delete(st,i+2,1);
writeln(st);
end;
while original<>st do blend(st);
end;
begin
clrscr;
writeln('Vvedite stroku: '); readln(st); writeln;
original:=st;
blend(st);
readkey;
end.
рекурсия
помогите с алгоритмом.
застрял на одном месте и дальше никак. думается мне, что двигаюсь не в том направлении. предложите свой вариант. если надо - выложу свой.
Код:
вот рабочий вариант проги.... НО без сортировки. пока могу только догадываться как она делается в данном случае, но что-то мне подсказывает, что эта сортировка будет сопряжена с кучей проблем.. и как бы не пришлось переписывать весь код. :/
помогите хотя бы с ЭТИМ, раз за саму рекурсию никто не взялся.
Цитата:
Originally posted by warlok_the
http://forum.pascal.net.ru/index.php?act=Search&CODE=show&searchid=17146e6d8ec92ddaca3f79520409f991&search_in=posts&result_type=topics&highlite=%2B%D0%E5%EA%F3%F0%F1%E8%FF
Вот посмотри тут, может чего найдёшь...
http://forum.pascal.net.ru/index.php?act=Search&CODE=show&searchid=17146e6d8ec92ddaca3f79520409f991&search_in=posts&result_type=topics&highlite=%2B%D0%E5%EA%F3%F0%F1%E8%FF
Вот посмотри тут, может чего найдёшь...
спасибо конечно, почитаю, но у меня проблема не в самой рекурсии, а именно в сортировке.. :\
Цитата:
Originally posted by U-rique
спасибо конечно, почитаю, но у меня проблема не в самой рекурсии, а именно в сортировке.. :\
спасибо конечно, почитаю, но у меня проблема не в самой рекурсии, а именно в сортировке.. :\
Держи, кодер =)
Код:
//сортирует строку методом пузырька
procedure SortLine(var Line: string);
var i,i1: integer;
tmp: char;
WasSwap: boolean;
begin
repeat
WasSwap:=false;
for i:=2 to Length(Line) do begin
i1:=i-1;
if Line < Line[i1] then begin
tmp:=Line;
Line:=Line[i1];
Line[i1]:=tmp;
WasSwap:=true
end;
end;
until not WasSwap;
end;
//пихает куданить новую строку
procedure PutLine(const Line: string);
begin
// Form1.Memo1.Lines.Add(Line)
end;
//собственно алгоритм
procedure Blend(Line: string);
var LineLen: integer;
Taken: array of boolean;
procedure _Blend(Deep: integer; Ind: integer; const Str: string);
var i: integer;
begin
Taken[Ind]:=true;
if Deep = LineLen then begin
PutLine(Str);
end else begin
for i:=1 to LineLen do begin
if not Taken then begin
_Blend(Deep+1,i,Str+Line);
end;
end;
end;
Taken[Ind]:=false;
end;
begin
LineLen:=Length(Line);
SortLine(Line);
SetLength(Taken,LineLen+1);
_Blend(0,0,'');
end;
procedure SortLine(var Line: string);
var i,i1: integer;
tmp: char;
WasSwap: boolean;
begin
repeat
WasSwap:=false;
for i:=2 to Length(Line) do begin
i1:=i-1;
if Line < Line[i1] then begin
tmp:=Line;
Line:=Line[i1];
Line[i1]:=tmp;
WasSwap:=true
end;
end;
until not WasSwap;
end;
//пихает куданить новую строку
procedure PutLine(const Line: string);
begin
// Form1.Memo1.Lines.Add(Line)
end;
//собственно алгоритм
procedure Blend(Line: string);
var LineLen: integer;
Taken: array of boolean;
procedure _Blend(Deep: integer; Ind: integer; const Str: string);
var i: integer;
begin
Taken[Ind]:=true;
if Deep = LineLen then begin
PutLine(Str);
end else begin
for i:=1 to LineLen do begin
if not Taken then begin
_Blend(Deep+1,i,Str+Line);
end;
end;
end;
Taken[Ind]:=false;
end;
begin
LineLen:=Length(Line);
SortLine(Line);
SetLength(Taken,LineLen+1);
_Blend(0,0,'');
end;
сие творение сделано на Delphi - работает. ты тока строки, длиной больше 8 туду не суй, ну сам понимаешь, количество перестановок ого какое.
кстати в алгоритме есь баг - если в слове буквы дублируются, то он выдаёт одну и туже последовательность стокаже раз, сколько одинаковых букв. в прочем закрыть дыру ты и сам смогёшь =)
спасибо за помощь, попробую разобрать/ся