La distinction importante n'est pas "récursif vs itératif", mais "récursif non-terminal vs. itératif ou
récursif terminal"... En ML ou en Scheme, on ne programme pas en itératif, mais on essaye quand même de programmer en récursif terminal à chaque fois que c'est possible : d'un point de vue algorithmique, la récursivité terminale et l'itérativité sont rigoureusement équivalentes, c'est juste la façon dont tu l'écris qui change ^^
Bref la différence entre récursivité non-terminale et récursivité terminale c'est que dans le premier cas il y a un état qui est sauvegardé sur la pile par le compilateur (et donc sur lequel tu n'as aucun contrôle), alors que dans le second cas la pile est écrite explicitement dans les arguments que tu passes à la fonction récursive terminale

(ou, dans le cas itératif, gardée explicitement en tant que variable de boucle)
L'avantage concret c'est que tu peux sauvegarder nettement moins de choses que ce que sauvegarderait le compilateur, et tu peux même parfois te dispenser d'avoir une pile
