Die Fähigkeit, etwas durch sich selbst zu definieren, nennt man Rekursion. In Gleam begegnet dir Rekursion am häufigsten in rekursiven Funktionen, also Funktionen, die sich selbst aufrufen.
Eine rekursive Funktion braucht mindestens einen Basisfall und mindestens einen Rekursionsfall. Ein Basisfall gibt einen Wert zurück, ohne die Funktion erneut aufzurufen. Ein Rekursionsfall ruft die Funktion erneut auf und verändert die Eingabe so, dass sie irgendwann zum Basisfall passt.
pub fn factorial(x: Int) -> Int {
case x {
// Base case
1 -> 1
// Recursive case
_ -> x * factorial(x - 1)
}
}
Gleam hat keine spezielle Syntax für Schleifen, deshalb setzt du jede Wiederholung mit Rekursion um.
pub fn list_length(list: List(String)) -> Int {
case list {
[] -> 0
[_, ..rest] -> 1 + list_length(rest)
}
}
Gleam unterstützt außerdem rekursive eigene Typen. Bei einem rekursiven eigenen Typ bezieht sich mindestens eine seiner Varianten über die Daten, die sie enthält, auf den Typ selbst.
pub type RussianDoll {
Child // Base case
Mother(RussianDoll) // Recursive case
}
let very_big_doll = Mother(Mother(Mother(Child)))
let small_doll = Mother(Child)