To kouzlo kterým se to dá provést se jmenuje rekurze. Volat jiné příkazy už umíš, ale napadlo tě co by se stalo kdyby příkaz zavolal sám sebe? Zkusíme si to na příkazu KE-ZDI, ten už umíš řešit cyklem DOKUD, ale teď vytvoříme cyklus pomocí rekurze:
Kód: Vybrat vše
KE-ZDI
KDYŽ NENÍ ZEĎ
KROK
KE-ZDI
KONEC
KONEC
Když není zeď, Karel udělá krok a zavolá příkaz KE-ZDI, a když není zeď... Ale když je zeď, tak neudělá krok a nic nezavolá, naopak příkaz skončí a program se vrátí do předchozího příkazu, a tak pořád dokola tolikrát kolikrát do té rekurze vstoupil.
Pozor na jednu věc, rekurze se dá velmi snadno zacyklit, takže si musíš ohlídat aby vždy byla možnost se z ní dostat! Nikdy nesmíš použít rekurzi bez nějaké podmínky, nebo vytvoříš nekonečnou smyčku, ta způsobí že program přestane reagovat, postupně zaplní celou paměť a spadne!
A teď se koukni jak by vypadal ten rekurzivní příkaz TAM-A-ZPĚT:
Kód: Vybrat vše
TAM-A-ZPĚT
KDYŽ NENÍ ZEĎ
KROK
TAM-A-ZPĚT
KROK
KONEC, JINAK
ČELEM-VZAD
KONEC
KONEC
Rekurze existují dva druhy, přímá, kdy tvůj příkaz volá přímo sám sebe, a nepřímá neboli vzájemná, kde se dva příkazy volají navzájem. Dva nebo víc, aby to nebylo tak jednoduché.
Zkus si nejdřív vymyslet příkaz který pomocí rekurze vysbírá všechny značky na políčku kde Karel stojí, a pak zapřemýšlej jak by se dal udělat ten rekurzivní TAM-A-ZPĚT.