Le C peut le faire ?? Je me coucherai moins bête ce soir !
Ça n'a aucun sens. La récursion terminale n'a rien à voir avec le C (comme tu le précise par la suite d'ailleurs) car ce n'est pas une propriété du langage. Un mauvais compilateur C ne le fera pas, un bon le fera. On parle ici d'implémentation du langage et pas du langage lui même. GCC donc le fait, et il le fait pour le C, le C++ et l'Ada. Je pense, mais ne peut pas l'affirmer, que GCC (le middle end du compilateur en fait) le fait pour tous les langages qu'il supporte.
Pourquoi n'est pas une propriété du langage? Parce que lorsque l'on écrit N * F (N-1) on exprime tout simplement une expression récursive sans considérer un seul instant l'implémentation et c'est tant mieux car l'implémentation est du ressort du compilateur. A lui de faire au mieux sans nous demander de préciser explicitement quoi que ce soit. Chacun son niveau d'expression et d'abstraction.
Donc ok ce n'est pas dans la norme C, ni dans la norme Ada mais c'est ce que fait tout bon compilateur car la récursion terminale n'est pas très difficile à transformer en boucle standard.
[^] # Re: C'est pourtant évident.
Posté par Pascal Obry (site web personnel) . En réponse à la dépêche Coder efficacement, bonnes pratiques et erreurs à éviter. Évalué à 3.
Ça n'a aucun sens. La récursion terminale n'a rien à voir avec le C (comme tu le précise par la suite d'ailleurs) car ce n'est pas une propriété du langage. Un mauvais compilateur C ne le fera pas, un bon le fera. On parle ici d'implémentation du langage et pas du langage lui même. GCC donc le fait, et il le fait pour le C, le C++ et l'Ada. Je pense, mais ne peut pas l'affirmer, que GCC (le middle end du compilateur en fait) le fait pour tous les langages qu'il supporte.
Pourquoi n'est pas une propriété du langage? Parce que lorsque l'on écrit N * F (N-1) on exprime tout simplement une expression récursive sans considérer un seul instant l'implémentation et c'est tant mieux car l'implémentation est du ressort du compilateur. A lui de faire au mieux sans nous demander de préciser explicitement quoi que ce soit. Chacun son niveau d'expression et d'abstraction.
Donc ok ce n'est pas dans la norme C, ni dans la norme Ada mais c'est ce que fait tout bon compilateur car la récursion terminale n'est pas très difficile à transformer en boucle standard.