Napíšte rekurzívnu procedúry, pomocou ktorých sa vykreslí "Cantorovu množinu" podľa predlohy na obrázku, do zvoleného stupňa.
Riešenie:
-
Obrázok si môžme rozdeliť na dve nezávisle časti. Prvá časť je čiara a druhá časť je neviditeľná čiara. Teda budeme mať dve procedúry cantorA a cantorB, obe procedúry budú mať rovnaké parametre a to dĺžka úsečky a stupeň.
viem cantorA :d :n |
|
viem cantorB :d :n |
koniec |
|
koniec |
- Procedúra cantorA bude kresliť viditeľnú čiaru a procedúra cantroB neviditeľnú, teda:
viem cantorA :d :n |
|
viem cantorB :d :n |
|
do :d |
|
|
ph do :d pd |
koniec |
|
koniec |
- Vo vyššom stupni sa bude úsečka deliť na tri rovnako dĺhé časti a to tak, že prostredná časť bude vynechaná (neviditeľná). Vieme, že jednotlivé úsečky sa budú vykresľovať pri stupni 0, takže môžme doplniť príkazy do procedúry cantorA
viem cantorA :d :n |
|
viem cantorB :d :n |
|
ak :n=0 [do :d ukonci] |
|
|
ak :n=0 [ph do :d pd ukonci] |
|
cantorA :d/3 :n-1 |
|
koniec |
|
cantorB :d/3 :n-1 |
|
|
|
cantorA :d/3 :n-1 |
|
koniec |
|
- Ešte nám ostáva vyriešiť, čo s druhou procedúrou. Pri vykonaní tejto procedúry nemá nič nakresliť, len sa má presunúť korytnačka. Úsečka sa síce má deliť na tri časťi, ale nekreslená čiara sa nemusí, pretože je jedno či nakreslíme tretiny pri sebe alebo jednu celú. Takže v procedúre bude volanie tejt istej procedúry s rovnakým parametrm, ale so zníženým stupňom
viem cantorA :d :n |
|
viem cantorB :d :n |
|
ak :n=0 [do :d ukonci] |
|
|
ak :n=0 [ph do :d pd ukonci] |
|
cantorA :d/3 :n-1 |
|
|
cantorB :d :n-1 |
|
cantorB :d/3 :n-1 |
|
koniec |
|
cantorA :d/3 :n-1 |
|
|
koniec |
|
Procedúru na vykreslenie Cantorovej množiny zavoláme pomocou príkazu cantorA 500 3
|