nepriama rekurzia

Príklad 3

Napíšte rekurzívny podprogram, ktorý nakreslí obrázok podľa predlohy, do zadaného stupňa (ak sa zadá 1, tak sa nakreslí len trojuholník A; ak 2, tak sa nakreslí trojuholník A a kruh; ak 3, tak sa nakreslí obrázok ako pri zadaní 2 a k nemu sa pridá trojuholník B, atď.).

trojuholník kruh trojuholník

Riešenie:

  1. Z predchádzajúcich príkladov už vieme, že najprv potrebujeme určiť z koľkých rôznych častí sa skladá výstup (obrázok). Máme nakresliť čiaru, ktorá sa skladá z dvoch rôznych trojuholníkov(každý z nich je vzhľadom na vodorovnú čiaru natočený na inú stranu) a s kruhu.
    Naše procedúry budú vyzerať takto:
    Procedúra pre kruh vyzerá takto:
    viem KRUHY
    elipsa[60 60]
    koniec

    Procedúra pre trojuholníky budú upravené už tak, ako sa budú od začiatku vykresľovať.
    Procedúra vyzerá:

    pre jeden trojuholník takto: a pre druhý takto:
    viem TROJ
    vl 90
    do 30 vp 120
    do 60 vp 120
    do 60 vp 120
    do 30
    koniec
    viem TROJR
    vl 30
    do 60 vp 120
    do 60 vp 120
    do 60 vp 120
    koniec

    Keďže kruh vieme vykresliť tak, že stojíme uprostred neho, preto musíme procedúru KRUHY upraviť. Upravíme ju tak, že prejdeme do prostriedku kruhu, potom vykreslíme kruh a zase prejdeme na koniec kruhu (na opačnú stranu s akej sme prišli) , aby sme vedeli vykresliť ďalší útvar, ktorý ma nasledovať za kruhom.
    Aj procedúry TROJ a TROJR upravíme tak, aby po dokončení kreslenia trojuholníka mohol sa vykresliť ďalší útvar, ktorý nasleduje.

    :-) Pri presúvaní, ktoré je len pomocné(vzhľadom k výstupu) nesmieme zabudnúť zdvihnúť pero (aby sme za sebou zbytočne neťahali čiaru) a potom ho zase položiť.

    Upravené procedúry vyzerajú takto:

    viem KRUHY
    ph
    do 30
    pd
    elipsa[60 60]
    ph
    do 30
    pd
    koniec

    viem TROJ
    vl 90
    do 30 vp 120
    do 60 vp 120
    do 60 vp 120
    do 30
    vp 90
    ph
    do (sqrt(60*60-30*30))/2
    pd
    vypln
    ph
    do (sqrt(60*60-30*30))/2
    pd
    koniec
    viem TROJR
    vl 30
    do 60 vp 120
    do 60 vp 120
    do 60 vp 120
    vp 30
    ph
    do (sqrt(60*60-30*30))/2
    pd
    nechfv ?
    vypln
    ph
    do (sqrt(60*60-30*30))/2
    pd
    koniec

  2. Už z predchádzajúcich príkladov vieme, že musíme definovať miesto pre rekurzívne volanie, parameter a spôsob zmeny parametra.
    • Rekurzívne volanie musí byť za príkazmi nakreslenia daného útvaru.
    • Parameter procedúry bude stupeň čiary (počet nakreslených útvarov).
    • Hodnota parametra sa bude znižovať vtedy, ak nakreslime príslušný útvar a v rekurzívnom volaní už bude hodnota parametra o 1 nižšia.

    Dôležité je rozhodnúť o tom, ktorá procedúra bude ktorú volať. Keďže najprv sa musí nakresliť trojuholník TROJR potom KRUHY a nakoniec TROJ, tak v takom poradí sa budú navzájom volať.

    • KRUHY bude volať TROJ
    • TROJ bude volať TROJR
    • TROJR bude volať KRUHY

    Upravene procedúry budú vyzerať takto:

    viem KRUHY :a
    ph
    do 30
    pd
    elipsa[60 60]
    ph
    do 30
    pd
    TROJR :a-1
    koniec

    viem TROJ :b
    vl 90
    do 30 vp 120
    do 60 vp 120
    do 60 vp 120
    do 30
    vp 90
    ph
    do (sqrt(60*60-30*30))/2
    pd
    vypln
    ph
    do (sqrt(60*60-30*30))/2
    pd
    TROJR :b-1
    koniec
    viem TROJR :c
    vl 30
    do 60 vp 120
    do 60 vp 120
    do 60 vp 120
    vp 30
    ph
    do (sqrt(60*60-30*30))/2
    pd
    nechfv ?
    vypln
    ph
    do (sqrt(60*60-30*30))/2
    pd
    KRUHY :c-1
    koniec

  3. Pre konečnosť nášho programu nám treba ešte určiť podmienku ukončenia a podľa toho upraviť procedúry. Ako v predchádzajúcich príkladov, tak aj tu musí platiť aby stupeň čiary bol väčší ako 0, inak sa nemôže nakresliť. Podľa toho stačí určiť podmienku, že program má bežať pokiaľ stupeň bude väčší ako 0.

    Riešenie:

    viem KRUHY :a
    ak :a>0
    [ ph
    do 30
    pd
    elipsa[60 60]
    ph
    do 30
    pd
    TROJR :a-1
    ]
    koniec
    viem TROJ :b
    ak :b>0
    [ vl 90
    do 30 vp 120
    do 60 vp 120
    do 60 vp 120
    do 30
    vp 90
    ph
    do (sqrt(60*60-30*30))/2
    pd
    vypln
    ph
    do (sqrt(60*60-30*30))/2
    pd
    TROJR :b-1
    ]
    koniec
    viem TROJR :c
    ak :c>0
    [ vl 30
    do 60 vp 120
    do 60 vp 120
    do 60 vp 120
    vp 30
    ph
    do (sqrt(60*60-30*30))/2
    pd
    nechfv ?
    vypln
    ph
    do (sqrt(60*60-30*30))/2
    pd
    KRUHY :c-1
    ]
    koniec

Aby sme nakrelsili požadovaný útvar tak sa zavolá napríklad procedúra KRUHY 5

Ak nie je vidieť Imagine projekt, treba stiahnuť Imagine plugin