Pour compléter les propos de @in-ho-yi répondre . Pour plus de simplicité, vous pouvez définir directement une fonction locale à l'intérieur d'une fonction anonyme et l'utiliser pour la récursivité. L'utilisation de @tailrec
avant la fonction locale, vous pouvez vous assurer qu'elle appliquera la récursivité de la queue, ce que vous ne pouvez pas faire avec le combinateur Y.
Cette approche est meilleure que celle de Y-combinator car elle n'ajoute que 2 frames à la pile et 1 par appel de la fonction (si elle n'est pas récursive, si elle l'est elle n'ajoutera que 1 au total donc 3 frames maximum seront utilisées) au lieu des 6 par appel que Y-combinator utilise.
import scala.annotation.tailrec
val fact = {(input: BigInt)=>
@tailrec
def f(x:BigInt, acc: BigInt = 1):BigInt = {
if(x<=1) acc
else f(x-1, x*acc)
}
f(input)
}
print(fact(1024))