किसी चीज़ को खुद के संदर्भ में परिभाषित करने की क्षमता को रिकर्शन कहते हैं। 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)