13. praktikum
0. Soojendusülesanne
Kirjuta rekursiivne funktsioon esineb, mille parameetriteks on mingi väärtus ja järjend ning mis tagastab True või False vastavalt sellele, kas see väärtus esineb järjendi elementide hulgas või mitte. Operaatori in
kasutamine pole lubatud.
Vihje 1. Mõtle, millise järjendi korral on vastus triviaalne.
Vihje 2. Vaata siit.
Vihje 3. Mittetühja järjendi puhul esineb otsitav väärtus järjendis siis, kui ta on järjendi „päises” (s.t võrdub esimese elemendiga) või kui ta esineb järjendi „sabas” (s.o järjendi esimese elemendi järel olevate elementide seas).
Lisa 1. Proovi selle funktsiooni keha panna kirja 4 reaga.
Lisa 2. Proovi selle funktsiooni keha panna kirja 1 reaga.
1. Esineb n korda
Täienda eelmise ülesande funktsiooni ühe lisaparameetriga, mis ütleb, mitu korda vähemalt antud väärtus peab esinema. Nt
esineb('a', ['a', 'b', 'a'], 2)
peaks tagastama True, aga
esineb('a', ['a', 'b', 'a'], 3)
peaks tagastama False.
2. Kolmeaastane
Kirjuta „Kolmeaastase lapse simulaator”, aga nii, et tsükli asemel oleks kasutatud rekursiooni.
3. n-nurk
Kirjuta funktsioon n-nurga joonistamiseks (justnagu siin), aga kasutades tsükli asemel rekursiooni. Funktsioonil peaks olema ainult üks parameeter, n.
Vihje 1. Mõistlik on asi lahendada kahe funktsiooniga – nõutud üheparameetriline funktsioon peaks arvutama välja, mitu kraadi tuleb iga nurga juures pöörata; põhitöö peaks ta delegeerima kaheparameetrilisele rekursiivsele abifunktsioonile.
Vihje 2. Abifunktsiooni parameetrid peaksid näitama, mitu külge on vaja joonistada ja mitu kraadi iga nurga juures pöörata.
4. Sügavus
Kirjuta rekursiivne funktsioon sügavus, mille parameetriks on järjend või mingi muu väärtus (näiteks täisarv) ning mis tagastab täisarvu, mis näitab kui „sügav” on antud väärtus. Ütleme, et mitte-järjendite sügavus on 0; ühemõõtmeliste järjendite (s.t selliste järjendite, mille elementide hulgas ei ole ühtegi järjendit) sügavus on 1; vastasel juhul on järjendi sügavus tema kõige sügavama elementjärjendi sügavus + 1.
Vihje 1.
>>> type([1, 2, 3]) == list True >>> type(1) == list False
Vihje 2. Seda ülesannet on kõige mugavam lahendada tsükli ja rekursiooni kombineerimisega. Tsükliga võiks liikuda „laiuti”, s.t läbi vaadeldava järjendi kõikide elementide, ja rekursiooniga „süviti”, s.t elementjärjendite sisse.
5. Fraktal
Kirjuta rekursiivne funktsioon, mis joonistab järgmise kujundi:
Vihje. Lõpeta rekursioon siis, kui kriipsude pikkus läheb liiga väikeseks.
Küsimus. Mitu korda peab olema iga järgnev kriips eelmisest lühem? Tegemist on ühe matemaatikas küllaltki tähtsa reaalarvuga.