Le mot-clé tailrec en Kotlin expliqué simplement
Le mot-clé tailrec sert à rendre certaines fonctions récursives plus efficaces.
Ne t’inquiète pas si le mot “récursif” te paraît compliqué : on va l’expliquer pas à pas.
C’est quoi une fonction récursive ?
Une fonction récursive est une fonction qui s’appelle elle-même.
Par exemple :
fun countDown(n: Int) {
if (n == 0) return
println(n)
countDown(n - 1) // La fonction s'appelle elle-même
}
C’est comme si tu disais à quelqu’un : « Compte de 5 jusqu’à 1. Quand tu enlèves 1, rappelle-moi pour continuer. »
Le problème de la récursion
Si tu appelles trop souvent une fonction récursive (par exemple avec un très grand nombre), tu peux finir par faire exploser la mémoire du programme. C’est l’erreur bien connue : StackOverflowError.
Que fait tailrec ?
Le mot-clé tailrec dit au compilateur Kotlin :
« Transforme cette fonction récursive en une simple boucle si c’est possible. »
Résultat :
- pas de risque d’erreur StackOverflow,
- la fonction est aussi rapide qu’une boucle
while, - tu gardes un code clair et simple.
Exemple sans tailrec
fun countdown(n: Int) {
if (n == 0) return
println(n)
countdown(n - 1)
}
Cette fonction fonctionne, mais si n est très grand, elle peut faire planter le programme.
Version optimisée avec tailrec
Voici la même fonction, mais optimisée :
tailrec fun countdown(n: Int) {
if (n == 0) return
println(n)
countdown(n - 1) // Dernière action de la fonction
}
Comme l’appel récursif est la dernière chose faite, Kotlin peut l’optimiser très fortement.
Une règle importante
L’appel à la fonction elle-même doit être la dernière instruction.
Sinon, tailrec ne marche pas.
Mauvais exemple :
fun sum(n: Int): Int {
return n + sum(n - 1) // ? quelque chose après l'appel récursif
}
Ici, il faut encore faire + n après avoir appelé la fonction, donc Kotlin ne peut pas
l’optimiser.
Pourquoi utiliser tailrec ?
- Pour éviter les crashs avec de grandes répétitions.
- Pour garder un code simple et lisible.
- Pour avoir les performances d’une boucle sans écrire la boucle toi-même.