Otočení spojového seznamu
Blíží se závěr semestru a jednou z věcí, které je třeba znát k úspěšnému složení zkoušky je práce s ukazateli. Proto jsme si zkusili naprogramovat proceduru, která otočí jednosměrný spojový seznam.
Na cvičení jsme vymysleli nerekurzivní variantu, která měla kvadratickou složitost vzhledem k počtu prvků. Rekurzivní varianta má složitost lineární. Výchozí zdrojový kód můžete použít k jejímu otestování:
procedure rev(var head: PBlok; var tail: PBlok);
var pom: longint;
newHead,newTail: PBlok;
begin
{ prazdny seznam }
if head = nil then
begin
tail := nil;
exit;
end;
{ jednoprvkovy seznam }
if head^.next = nil then
begin
tail:= head;
exit;
end;
{ dvouprvkovy seznam }
if head^.next^.next = nil then
begin
pom:=head^.value;
head^.value:=head^.next^.value;
head^.next^.value:=pom;
tail:= head^.next;
exit;
end;
{ vice nez dvouprvkovy seznam }
newHead:= head^.next;
rev(newHead,newTail); { otoc zbytek seznamu }
newTail^.next:=head; { pripojeni puvodni hlavy }
head^.next:=nil;
tail:= head; { nastaveni vystupnich parametru }
head:=newHead;
end;
Minimax
Uvažujme pro jednoduchost deskovou hru dvou hráčů s plnou informací. Při takové hře oba hráči znají celý aktuální stav (popis hrací desky + informace o tom, kdo je na tahu). Máme-li naprogramovat umělou inteligenci do takové hry, potřebujeme nějak zjistit, jak dobrý je stav, do kterého můžeme hru dostat provedením nějakého konkrétního tahu. K ohodnocení nějakého konkrétního stavu hry S lze použít rekurzivní funkci zvanou minimax.
| utility(S) // game over
minimax(S) = | min[s in next(S)](minimax(s)) // tahne min
| max[s in next(S)](minimax(s)) // tahne max
Přitom předpokládáme, že hrají dva hráči - min a max.
První se snaží dosáhnout co nejnižšší hodnotu a druhý naopak co nejvyšší. Pouze koncové stavy (game over) mají definovánu hodnotu utility jako nějaké číslo. Ve stavu S, který není koncový se počítá funkce rekurzivně jako minimum/maximum ze všech stavů, do kterých se lze z S dostat legálním tahem hráče, který je zrovna na tahu. Všechny takové stavy obsahuje množina next(S).
Použití funkce minimax jsme si demonstrovali na zjednodušené variantě hry nim.
Domácí úkol
Nic nebylo zadáno. Doporučuji ale zkusit si další příklady s ukazateli.