어떤 대상을 자기 자신을 이용해 정의하는 것을 재귀라고 해요. 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)