Перестановки (3 уровень)

Условие:
Даны n чисел в произвольном порядке. Вывести на экран всевозможные их перестановки.

Решение: (by Pavel [prog_mail@ukr.net])
type mn=set of 1..200;
var m,d,n,i: integer;
    s: mn;
    a,b: array[1..200] of integer;

  procedure View;
  var i: integer;
  begin
   writeln;
   for i:=1 to n do
   write(b[a[i]],' ');
  end;

  procedure Per(s: mn; k: integer);
  var i: integer;
  begin
   for i:=1 to n do
   If i in s then
   begin
   a[k]:=i;
   per(s-[i],k+1);
   end;
   if s=[] then view;
  end;

BEGIN
  writeln('
Введите кол-во чисел');
  readln(n);
  writeln('
Введите числа');
  for i:=1 to n do
  read(b[i]);
  writeln('
Перестановки :');
  per([1..n],1)
END.