• [^] # Re: C'est pourtant évident.

    Posté par (site web personnel) . En réponse à la dépêche Coder efficacement, bonnes pratiques et erreurs à éviter. Évalué à 2.

    Et moi je te dis que si. Il y aura une optimisation pour transformer la récursion en boucle (ou pas), mais ce code est du C parfaitement valide. Il n'y a pas de discussion possible ici : il est écrit en C, qui autorise la récursion.

    Valide ou pas, il mène à un bug avec plusieurs compilateur C. Ça te fais une belle jambe que ton programme soit théoriquement valide si en pratique il plante à l’exécution :) J’ai l’impression que la garantie que ton code s’exécute en mémoire bornée n’a aucune espèce d’importance pour toi.

    Si la sémantique du langage dit que un fonction qui s’appelle infiniment doit tourner infiniment, alors la sémantique est stupide dans le sens où elle affirme quelque chose d’impossible ! Si une fonction a besoin d’une infinité de mémoire, alors on ne peut pas la faire tourner.

    C’est pourquoi en pratique il est important de savoir dans quel cas, on peut faire une récursion infinie. C’est un problème pratique, pas théorique. La norme du langage C ne permet pas de garantir les récursions infinies dans le cas des récursion terminal ; et c’est d’ailleurs pourquoi que certain compilateur transforme des récursion infinies en des programmes qui plantent systématiquement quelque soit la mémoire.

    Tu répètes en boucle qu’on peut implémenter la récursion terminal en C, mais j’ai jamais prétendu l’inverse !

    1. Je n’ai jamais dis que c’est impossible
    2. Je n’ai jamais dis non plus que c’était systématiquement fait dans les langages fonctionnel (j’ai toujours dit généralement)
    3. J’ai jamais dis que ce n’était jamais fait dans les langages impératifs, j’ai dit en général que ce n’était pas fait (et c’est vrai pour .Net, java, rust, python...).
    4. Tu ne tiens pas compte de la distinction entre être dans la norme du langage ou être simplement une possibilité. Quand tu écrit un code tu veux qu’il marche avec tous les compilateurs et pas seulement un. Avoir une garantie est importante ! Qui te dit que demain gcc trouve une super optimisation incompatible avec l’optimisation des fonctions recursif terminal ? Et dans ce cas là tu fais quoi ? Tu as bien Rust qui n’implémente pas cette optimisation car avec les choix qu’il on fait, cela s’avère trop compliqué. Pourquoi pas gcc demain ?

    Mais dire qu'en pratique on ne pratique pas la récursion, c'est un peu osé.

    Certes ; mais c’est beaucoup plus rare. Il serait intéressant de savoir combien il y a de fonction récursive dans le noyau Linux. J’avoue en avoir aucune idée, mais à mon avis il n’y en a pas beaucoup.

    De plus je doute que beaucoup d’entre eux utilise le fait que la récursion terminal existe pour être correct.