Napíšte rekurzívny podprogram, ktorý nakresli prerušovanú čiaru, podľa zadaného stupňa (ak sa zadá 1 tak sa nakresli len čiara, ak 2 tak sa nakresli čiara a neviditeľná čiara, atď.).
![prerušovaná čiara](obrazky/pic01.PNG)
Riešenie:
- Pri nepriamej rekurzii je potrebné si uvedomiť, z koľkých rôznych procedúr sa skladá program.
Keďže my máme nakresliť prerušovanú čiaru a táto sa skladá z čiernej čiarky a priesvitnej čiarky, tak náš program sa bude skladať z dvoch procedúr.
Procedúru, ktorá bude kresliť čiernu čiarku nazveme CIARA , keďže nemáme zadané ako dlhá ma byť čierna a priesvitná čiara, tak si dĺžku zvolíme.
Procedúra čiara bude vyzerať takto:
Procedúru, ktorá bude kresliť priesvitnú čiarku nazveme NIC a tak isto si zvolíme dĺžku tejto čiary sami. Telo procedúry bude vyzerať takto:
viem NIC |
|
peroHore |
|
do 20 |
|
peroDole |
koniec |
- Už máme určené procedúry, je potrebné určiť miesto volania druhej procedúry v prvej a opačne.
Vieme, že sa najprv musí nakresliť čiara, potom neviditeľná čiara, potom zase čiara a tak ďalej. Takže v procedúre CIARA, za príkazy pomocou ktorých sa nakresli čiara, dáme volanie na druhú procedúru NIC.
viem CIARA |
|
do 40 |
|
NIC |
koniec |
A v procedúre NIC za príkazy, ktoré nakreslia neviditeľnú čiaru dáme volanie na procedúru CIARA.
viem NIC |
|
peroHore |
|
do 20 |
|
peroDole |
|
CIARA |
koniec |
- Takto napísané procedúry budú kresliť to čo chceme, ale sa budú volať donekonečna. My máme dané, že sa má nakresliť čiara podľa zadaného stupňa. Podľa toho vieme, že stupeň čiary musí byť vstupný parameter procedúry CIARA (pretože sa má ako prvá nakresliť). Ale keďže v procedúre NIC je volanie na procedúru CIARA, tak aj NIC musí mať nejaký parameter, a to taký, aby vedela čo má dať ako parameter do volania procedúry CIARA (takže tiež bude mať vstupný parameter stupeň čiary).
Označme si stupeň čiary ako n jednej procedúre a a v druhej procedúre.
viem CIARA :n |
|
do 40 |
|
NIC |
koniec |
|
viem NIC :a |
|
peroHore |
|
do 20 |
|
peroDole |
|
CIARA |
koniec |
|
- Stupeň čiary n vyjadruje počet čiar (aj čiernych aj neviditeľných), tak po nakreslení jednej čiarky nám treba nakresliť už len n-1 čiar. To ale znamená, že musíme zmeniť hodnotu parametra. V procedúre musíme napísať príkaz (za príkazom nakreslenia čiary), aby sa stupeň čiary znížil o jedno. Toto zníženie parametra stačí napísať ku príkazu volania druhej procedúry (procedúra musí mať nejaký vstupný parameter).
viem CIARA :n |
|
do 40 |
|
NIC :n-1 |
koniec |
|
viem NIC :a |
|
peroHore |
|
do 20 |
|
peroDole |
|
CIARA :a-1 |
koniec |
|
- To že už máme vstupný parameter a vieme aj ako ho máme meniť v jednotlivých volaniach, ešte nevyriešilo problém nekonečnosti vykonávania rekurzie. Potrebujeme určiť vhodnú podmienku, kedy sa bude program vykonávať (alebo kedy sa prestane vykonávať). Stupeň čiary nám udáva, koľko čiar sa má nakresliť. To znamená, že ak odpočítavame stupeň čiary a dostaneme sa k hodnote 0, tak by mal program skončiť (nemôžeme mať záporný stupeň čiary). Stačí nám určiť podmienku, že ak je stupeň väčší ako nula, tak nech sa program vykonáva inak skončí. Túto podmienku však musíme dať do oboch procedúr, pretože nevieme koľkokrát sa bude volať každá procedúra a pri ktorom volaná skončí program (to záleží od veľkosti stupňa a od toho či je stupeň párne alebo nepárne číslo) .
viem CIARA :n |
|
ak :n>0 |
|
[ |
do 40 |
|
|
NIC :n-1 |
|
] |
|
koniec |
|
viem NIC :a |
|
ak :a>0 |
|
[ |
peroHore |
|
|
do 20 |
|
|
peroDole |
|
|
CIARA :a-1 |
|
] |
|
koniec |
|
Aby sme nakreslili čiaru tak zavoláme procedúru čiara, napríklad takto CIARA 5
Ak nie je vidieť Imagine projekt, treba stiahnuť Imagine plugin
|