Azt a képességet, hogy valami önmaga segítségével definiálható legyen, rekurziónak nevezzük. A Gleamben a rekurzió leggyakrabban rekurzív függvényekben fordul elő, vagyis olyan függvényekben, amelyek önmagukat hívják meg.
Egy rekurzív függvénynek legalább egy alapesetre és legalább egy rekurzív esetre van szüksége. Az alapeset úgy ad vissza egy értéket, hogy nem hívja meg újra a függvényt. A rekurzív eset újra meghívja a függvényt, és módosítja a bemenetet, hogy az előbb-utóbb illeszkedjen az alapesethez.
pub fn factorial(x: Int) -> Int {
case x {
// Base case
1 -> 1
// Recursive case
_ -> x * factorial(x - 1)
}
}
A Gleamben nincs külön szintaxisa a ciklusokra, ezért minden ciklust rekurzióval írunk meg.
pub fn list_length(list: List(String)) -> Int {
case list {
[] -> 0
[_, ..rest] -> 1 + list_length(rest)
}
}
A Gleam támogatja a rekurzív egyedi típusokat is. Egy rekurzív egyedi típusban a változatok közül egy vagy több a bennük tárolt adatban magára a típusra hivatkozik.
pub type RussianDoll {
Child // Base case
Mother(RussianDoll) // Recursive case
}
let very_big_doll = Mother(Mother(Mother(Child)))
let small_doll = Mother(Child)