Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

рекурсия

13K
22 декабря 2005 года
U-rique
12 / / 11.12.2005
Строка содержит n букв. Разработать и реализовать рекурсивный алгоритм, позволяющий получить все перестановки букв строки и выдающий их на экран в алфавитном порядке.

помогите с алгоритмом.
застрял на одном месте и дальше никак. думается мне, что двигаюсь не в том направлении. предложите свой вариант. если надо - выложу свой.
13K
28 декабря 2005 года
U-rique
12 / / 11.12.2005
Код:
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.


вот рабочий вариант проги.... НО без сортировки. пока могу только догадываться как она делается в данном случае, но что-то мне подсказывает, что эта сортировка будет сопряжена с кучей проблем.. и как бы не пришлось переписывать весь код. :/

помогите хотя бы с ЭТИМ, раз за саму рекурсию никто не взялся.
13K
28 декабря 2005 года
U-rique
12 / / 11.12.2005
Цитата:




спасибо конечно, почитаю, но у меня проблема не в самой рекурсии, а именно в сортировке.. :\

5
29 декабря 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
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;

сие творение сделано на Delphi - работает. ты тока строки, длиной больше 8 туду не суй, ну сам понимаешь, количество перестановок ого какое.

кстати в алгоритме есь баг - если в слове буквы дублируются, то он выдаёт одну и туже последовательность стокаже раз, сколько одинаковых букв. в прочем закрыть дыру ты и сам смогёшь =)
13K
08 января 2006 года
U-rique
12 / / 11.12.2005
спасибо за помощь, попробую разобрать/ся
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог