04 - for ciklus rekurzióval¶
Visszatérve a korábbi kérdésre, egy for ciklust most már tudunk írni rekurzióval. Lássuk a tipikus C példánkat még egyszer:
1 2 3 |
|
i
az egyetlen
változónk, ami a ciklus törzsében nem változik meg, a következő iterációban pedig eggyel nagyobb
i
-re hívjuk a ciklusmagot, stb.
For ciklus valamettől tízig¶
Ez megoldható rekurzióval: csak írnunk kell egy függvényt, ami paraméterként megkapja i
-t:
1 2 3 4 5 6 7 8 |
|
- Ciklusban ,,végrehajtunk'' valamit, lényegében csak kifejezéseket értékelünk ki,
az eredményeket (ha vannak) (most pl. tíz Unit típusú
()
érték potyog ki menet közben aprintln
függvény kiértékelésekor) eldobjuk: ezért magának a ciklus kifejezésnek a típusa Unit lesz (kell neki egy típus) - az
else ()
kódrészlet azért van ott, mert azif-else
szerkezetnek része az, hogy ha a faltétel hamis, akkor is meg kell mondjuk, hogy mi legyen a kifejezés értéke; mindig kell, hogy legyen érték. Ha egyif-else
kifejezésbe nem írunkelse
ágat, a fordító odagenerál egyelse ()
végződést, ami vagy az, ami nekünk kell és jó lesz, vagy nem.
Tehát ez is ugyanaz, mint a fentebbi:
1 2 3 4 5 6 |
|
printTizig(7)
-tel hívjuk a függvényt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
n
-re hívnánk a függvényt,
annál jobban meghízna), itt ebben a példánkban egy állandó hossza volt minden iterációban. Ez jobb.
For ciklus valamettől valameddig¶
Persze a fenti kódban az, hogy konstans 10-ig el tudunk menni, az nem túl hasznos, de egy kis módosítással persze a felső korlátot is tudjuk kezelni - csak át kell adjuk paraméterként azt is:
1 2 3 4 5 6 |
|
- egyelőre csak println-olni tudunk, ha mást kéne csinálni a ciklusváltozóval, akkor azt azért mégiscsak el kéne kerülni, hogy ilyen mintára el kelljen készítsünk egy csomó másik függvényt, ahányszor csak egy for ,,ciklusra'' lenne szükségünk
- a
from
ciklus,,változó''t is beégetve mindenképp eggyel növeljük, ezt is jó volna customizálni anélkül, hogy minden use case-re egy újabb és újabb függvényt kéne implementálnunk
Ezeket meg fogjuk később oldani, mikor függvény típust is átadunk paraméterként.
Kérdések, feladatok¶
- Értékeld ki az operatív szemantika szerint a
myForLoop(1,4)
-et! - Meg tudnád-e fogalmazni, hogy mi lehet a különbség a faktoriális és a forciklus rekurziói közt, hogy az előbbi egyre inkább töltötte a stacket, az utóbbi pedig nem?
Utolsó frissítés: 2021-02-07 23:06:47