Rekurziónak nevezzük azt, amikor valami önmagára hivatkozva definiálható. Az F#-ban a rekurzió leggyakrabban rekurzív függvényekben fordul elő, amelyek önmagukat hívják.
Egy rekurzív függvénynek legalább egy alapesettel és legalább egy rekurzív esettel kell rendelkeznie. Az alapeset anélkül ad vissza egy értéket, hogy újra meghívná a függvényt. A rekurzív eset újra meghívja a függvényt, módosítva a bemenetet, hogy az előbb-utóbb megfeleljen az alapesetnek.
A rekurzív függvényeket ugyanúgy definiáljuk, mint a normál függvényeket, de a rec módosítóval. E módosító nélkül egy függvény nem tudja meghívni önmagát, és minden erre irányuló kísérlet fordítási hibát okoz. A rekurziót tehát explicit módon kell engedélyezni.
let rec factorial x =
// Base case
if x = 1 then
1
// Recursive case
else
x * factorial (x - 1)
Az F# a rekurzív típusokat is támogatja, méghozzá megkülönböztetett uniótípusok segítségével. Egy rekurzív megkülönböztetett uniótípus esetében egy vagy több eset adata magára az uniótípusra hivatkozik. A rekurzív függvényekhez hasonlóan a rekurzív típusoknak is legalább egy alapesettel kell rendelkezniük. A rekurzív függvényektől eltérően a rekurzív típusok nem használják a rec kulcsszót.
type RussianDoll =
| Doll // Base case
| Layer of RussianDoll // Recursive case
Ebben a feladatban egy pizzériában dolgozol, amely házhoz szállít.
Háromféle pizzát kínálsz:
A vásárlók kis felár ellenében két további lehetőséget is választhatnak:
Amikor a vásárlók rendelnek, további díjat számítunk fel, ha csak egy vagy két pizzát rendelnek:
Három feladatod van, amelyek mindegyike pizzákkal és azok árával foglalkozik.
Definiáld a Pizza diszkriminált uniót, amely a pizzatípusokat és a pizzához adható két további lehetőséget reprezentálja:
MargheritaCapreseFormaggioExtraSauceExtraToppingsValósítsd meg a pizzaPrice függvényt, amely kiszámítja egy pizza árát:
pizzaPrice Caprese
// => 9
Valósítsd meg az orderPrice függvényt, amely kiszámítja egy pizzarendelés árát:
orderPrice [Margherita; Formaggio]
// => 19
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) F# nyelvet 18 fogalom148 feladat segítségével, valódi emberi mentorálással, mindez ingyen.