Autorské riešenie
[stiahni]

Vieme, že robot vo veku troch rokov ma takúto fotku:

robot vo veku troch rokov

To znamená, že ak má jeden rok, tak jeho fotka bude mať iba jednu hlavu, dve oči a dve uši.

robot vo veku jedneho roka

Ako vidíme, tak hlava robota je symetrická podľa niekoľkých osí (zvislej, vodorovnej). Túto skutočnosť využijeme pri vykresľovaní hlavy, ktorá pozostáva z dvoch rovnakých časti vymedzených (modrou) úsečkou:

robot vo veku jedneho roka

Začneme kresliť z dolného pravého rohu (červené bodka) a v cykle s dvoma opakovaniami vykreslíme tvár. Na vykreslenie tváre jednoročného robotoobra s veľkosťou hlavy a, vytvoríme procedúru robotobor s parametrom a.

viem robotobor :a
  opakuj 2 [ do :a/4
             
             ;kreslenie oka
             ph do :a/8 pd
             polygon [opakuj 4 [do (:a/4) vl 90]]
             ph vz :a/8 pd
             vp 90
             ;konec kreslenia oka

             do :a/4   vl 90
             do :a/2   vl 90
             do :a/4   vp 90
             do :a/4   vl 90
             do :a     vl 90
           ] 
koniec

Podľa zadania vieme, že každý rok narastie robotobrovi na ušiach ďalšia hlava. Vytvorenú procedúru robotobor upravíme tak, že v časti po vykreslení oka a úsečky s dĺžkou a/4 pred vykreslením ucha vsunieme rekurzívnu procedúru na vykreslenie hlavy s parametrom a/2.
Hlavu kreslíme z pravého dolného rohu. Na nasledujúcom obrázku je znázornené miesto, kde začneme kresliť ďalšiu hlavu.

robot

Upravená procedúra robotobor vyzerá takto:

viem robotobor :a
  opakuj 2 [ do :a/4
             
             ;kreslenie oka
             ph do :a/8 pd
             polygon [opakuj 4 [do (:a/4) vl 90]]
             ph vz :a/8 pd
             vp 90
             ;konec kreslenia oka

             do :a/4
             robotobor :a/2
             vl 90
             do :a/2   vl 90
             do :a/4   vp 90
             do :a/4   vl 90
             do :a     vl 90
           ] 
koniec

Aby sme zabezpečili konečnosť rekurzívnej procedúry, doplníme do procedúry ďalší parameter n, ktorý bude predstavovať počet rokov robotobra a doplníme podmienku, kedy budeme vykonávať túto procedúru. Výsledná procedúra bude vyzerať nasledovne:

viem robotobor :a :n
  ak :n>=1 [ 
    opakuj 2 [ do :a/4
               
               ;kreslenie oka
               ph do :a/8 pd
               polygon [opakuj 4 [do (:a/4) vl 90]]
               ph vz :a/8 pd
               vp 90
               ;konec kreslenia oka

               do :a/4
               robotobor :a/2 :n-1
               vl 90
               do :a/2   vl 90
               do :a/4   vp 90
               do :a/4   vl 90
               do :a     vl 90
             ] 
           ] 
koniec

Ak má robotobor štyri roky, jeho hlava vyzerá takto :-) :

robot

Vaše zaujímavé riešenia a najčastejšie chyby

 Len jeden riešiteľ vyriešil úlohu úplne správne. V riešeniach sme našli tieto chyby:

  • vynechanie podmienky v rekurzívnej procedúre, čo spôsobilo nekonečný cyklus,
  • vynechanie druhého parametra procedúry a nevyhnutný zásah do pamäti, aby sa dala zmeniť hodnota globálnej premennej,
  • nedôslednosť pri analyzovaní úlohy, ktorá spôsobila nepresné vykreslenie obrázka a pri nerekurzívnych riešenia vykreslenie neúplných obrázkov

V dvoch riešeniach sa objavila procedúra štart, ktorá nebola vhodne použitá.

Zápisy niektorých procedúr boli neprehľadné, do jedného riadku odporúčame písať jeden príkaz, resp. skupinu príkazov, ktoré nejako evidentne súvisia napr. riešia nejakú podúlohu.