program GenerovaniVSoustave;
{ Načte čísla N a K a následně generuje posloupnosti délky K s čísly 0...N-1.
Počítáme s tím, že N<10 a K<=1000. }
var cifry : array[1..1000] of integer;
N,K : integer;
{ Procedura vypíše všechny hodnoty v poli cifry na pozicích 1 až celkem.
Mezi ciframi vypisuje mezery a za poslední cifrou odřádkuje. }
procedure vypisCifry(celkem : integer);
var i : integer;
begin
if (celkem > 0) then
begin
for i := 1 to celkem-1 do
write(cifry[i],' ');
writeln(cifry[celkem]);
end;
end;
{ Rekurzivní procedura.
Posloupnost se generuje od 1.indexu až po K. do pole s názevm cifry - to je globální.
Koncová podmínka rekurze je taková, že už nezbývá vyplnit žádné pozice.
Parametry celkem a soustava jsou fixní ve všech voláních této procedury.
Parametr index určuje index pole cifry, na který budeme zapisovat novou cifru.
Parametr zbyva značí, kolik ještě volných pozic v posloupnosti zbývá zaplnit.
Parametr celkem určuje celkovou delku posloupnosti.
Parametr soustava určuje, z jaké soustavy bereme číslice. }
procedure Generuj(index, zbyva, celkem, soustava : integer);
var i : integer;
begin
if (zbyva <= 0) then { Narazili jsme na koncovou podmínku rekurze. }
vypisCifry(celkem) { Vypíšeme vygenerovanou posloupnost, kterou jsme si uložili do pole. }
else
for i := 0 to soustava-1 do { Na aktuální pozici postupně zapisujeme všechny možné cifry v zadané soustavě. }
begin
cifry[index] := i; { Vyplníme aktuální pozici. }
Generuj(index+1,zbyva-1,celkem,soustava); { Rekurzivně se zavoláme na zbytek posloupnosti. }
end; { Všimněte si, že první parametr se zvětší o jedna a druhý zmenší o jedna
a zbylé dva zůstávají stejné. Proč? }
end;
begin
read(N,K);
Generuj(1,K,K,N); { Na začátku vyplňujeme od indexu 1, zbývá vyplnit celou posloupnost, tedy K pozic.
Celkem má posloupnost též K pozic. A soustava má základ N.}
end.
{ Poznámky na závěr:
1) Některé parametry procedury Generuj jsou zbytečné a daly by se odvodit z ostatních. Které?
2) Všimněte si, že nepoužíváme žádné globální proměnné - jen globální pole cifry.
Proč myslíte, že to je výhodné? (Nepoužívat moc globálních proměnných.)
3) Promyslete si, v jakém pořadí bude program vypisovat posloupnosti například pro vstup 2 4.
A co vstup 4 2? Byl vás typ správný?
}
Kdo byste našel v nějakém z těchto programů chybu, dejte mi to vědět - můžete tak získat bonusové body (1 chyba ≈ 5 bodů). ;)