某个事物能够用自身来定义,这种能力称为递归。在 Gleam 中,递归最常见于递归函数,也就是调用自身的函数。
递归函数至少需要一个_基本情况_和至少一个_递归情况_。_基本情况_会返回一个值,不再调用该函数。_递归情况_会再次调用该函数,并修改输入,使其最终与基本情况匹配。
pub fn factorial(x: Int) -> Int {
case x {
// Base case
1 -> 1
// Recursive case
_ -> x * factorial(x - 1)
}
}
Gleam 没有专门用于循环的语法,所以所有循环都通过递归完成。
pub fn list_length(list: List(String)) -> Int {
case list {
[] -> 0
[_, ..rest] -> 1 + list_length(rest)
}
}
Gleam 还支持递归自定义类型。递归自定义类型的一个或多个变体会在各自包含的数据中引用自身。
pub type RussianDoll {
Child // Base case
Mother(RussianDoll) // Recursive case
}
let very_big_doll = Mother(Mother(Mother(Child)))
let small_doll = Mother(Child)