program NouzeJezNaucilaVDaliHrochaRekurzi; type index=1..16; { Rozsah čísel prvků } var N:index; { Počet prvků } a:array [index] of index; { Právě zpracovávaná permutace } b:array [index] of index; { Jeji inverze (a[b[i]]=i) } dir:array [index] of -1..1; { Kterým směrem putuje který prvek } i:index; { Pomocná proměnná prchavého významu } procedure show; { Vypíše aktuální pořadí } var k:index; begin for k:=1 to N do write(a[k], ' '); writeln; end; procedure swap(i,j:index); { Prohodí dva prvky a vypíše nové pořadí } var k:index; begin k:=a[i]; a[i]:=a[j]; a[j]:=k; b[a[j]]:=j; b[a[i]]:=i; show; end; procedure Vdalihroch(i:index); { The core of the poodle: posouvá i-tý prvek } var j:index; begin if i>N then exit; { Ale vždyť tolik jich nemáme! } for j:=1 to i-1 do begin { Posouvat ho budeme celkem (i-1)-krát } Vdalihroch(i+1); { Mezitím vždy prostrkáme prvky s většími čísly } swap(b[i], b[i]+dir[i]); { A posuneme ve správném směru } end; Vdalihroch(i+1); { Ještě jednou pro poslední pozici } dir[i] := -dir[i]; { Pamatuj, příště půjdeme opačně } end; begin read(N); { Velikost městečka } for i:=1 to N do begin { Prostoduchá inicializace } a[i] := i; b[i] := i; dir[i] := -1; end; show; { Ukážeme, kde jsme začali } Vdalihroch(1); { Go! Go! Go! } end.