Skip to content

Instantly share code, notes, and snippets.

@valdo404
Last active September 27, 2023 21:05
Show Gist options
  • Save valdo404/865b6a170db6db00a70b530788c8850a to your computer and use it in GitHub Desktop.
Save valdo404/865b6a170db6db00a70b530788c8850a to your computer and use it in GitHub Desktop.
tail recursion
  • Thématique: En Scala, l'annotation @tailrec est utilisée pour informer le compilateur qu'une optimisation de la récursion en queue est attendue.
  • Aspect technique: Si le compilateur détecte qu'une optimisation n'est pas possible, il renverra une erreur de compilation. Ce mécanisme assure que le développeur est conscient des implications de performance de son code.
  • Thématique: Une introduction complète aux appels en queue, leur importance dans la programmation fonctionnelle, et comment différents langages gèrent ces appels.
  • Aspect technique: La récursion en queue peut être optimisée en un saut d'instruction au lieu d'un appel de fonction complet, économisant ainsi de l'espace de pile.
  • Thématique: La corecursion est essentiellement la récursion déroulée "en avant". Au lieu de résoudre un gros problème en plus petits sous-problèmes, elle construit un gros problème à partir de plus petites pièces.
  • Aspect technique: Très utile pour créer des structures de données infinies comme des listes ou des flux paresseux.
  • Thématique: L'article explique pourquoi l'élimination de la récursion en queue est un aspect puissant de la programmation fonctionnelle.
  • Aspect technique: L'optimisation de la récursion en queue peut transformer une complexité spatiale O(n) en O(1), ce qui a un impact énorme sur les performances.
  • Thématique: Explique comment Elm, un langage fonctionnel pour le développement front-end, gère la récursion en queue.
  • Aspect technique: Elm a un compilateur qui optimise automatiquement les appels en queue, ce qui permet une utilisation plus efficace de la mémoire et de la CPU.
  • Thématique: Lean est à la fois un langage de programmation et un prouveur de théorème, et il utilise des mécanismes formels pour valider la récursion en queue.
  • Aspect technique: En raison de ses capacités formelles, Lean peut non seulement optimiser les fonctions mais aussi prouver leur correction.
  • Thématique: L'induction structurelle est une technique de preuve pour les structures de données récursives.
  • Aspect technique: Cette méthode est très utile dans la vérification formelle et peut être utilisée pour prouver l'exactitude des algorithmes récursifs.
  • Thématique: Une fonction récursive générale peut être définie de manière à ne pas être garantie de terminer, à la différence des fonctions récursives primitives.
  • Aspect technique: Ces fonctions sont importantes dans le contexte de la théorie de la calculabilité.
  • Thématique: Ces fonctions sont des cas spéciaux de fonctions récursives générales qui sont garanties de terminer.
  • Aspect technique: Elles sont souvent utilisées dans les démonstrations mathématiques pour représenter des fonctions calculables qui sont "simples".

Résumé

  • Pour un code Scala, utilisez l'annotation @tailrec pour assurer une optimisation.
  • Dans les projets nécessitant des structures de données extensibles, envisagez d'utiliser la corecursion.
  • Pour la vérification de la correction de vos algorithmes récursifs, utilisez des techniques d'induction structurelle.

transformer un algorithme récursif non "stack-safe" en un algorithme "stack-safe" est un problème récurrent en informatique. Voici quelques techniques automatisées et semi-automatisées :

Trampolining Description: Utilisation d'une fonction "trampoline" qui exécute les appels récursifs de manière itérative. Langages: Java, JavaScript, Scala, etc. Code: scala Copy code sealed trait Trampoline[+A] case class Done[A](result: A) extends Trampoline[A] case class More[A](next: () => Trampoline[A]) extends Trampoline[A] Automatisation: Des librairies peuvent automatiser cela, mais souvent nécessite une réécriture manuelle.

Tail Call Elimination / Tail Call Optimization (TCO) Description: Le compilateur ou l'interpréteur remplace les appels récursifs en queue par des jumps, rendant l'algo stack-safe. Langages: Scheme, Haskell, Erlang, etc. Automatisation: Prise en charge par le compilateur.

Continuations Description: Utilise des objets de continuation pour stocker l'état de la pile et évite ainsi le débordement de pile. Langages: Scheme, Ruby, etc. Automatisation: Dépend du langage et de la librairie, peut nécessiter une réécriture manuelle.

Conversion en Itératif Description: Certains outils et compilateurs peuvent convertir un algorithme récursif en une version itérative. Langages: Divers Automatisation: Des outils comme les convertisseurs de code peuvent le faire mais sont souvent limités dans leur portée.

Utilisation de Piles Explicites Description: Remplacement de la pile d'appel du système par une pile gérée par l'utilisateur. Langages: Tout langage. Automatisation: Nécessite généralement une réécriture manuelle du code.

Memoization / Tabulation Description: Bien que non directement lié au stack safety, la mémoïsation peut réduire le nombre d'appels récursifs. Langages: Tout langage Automatisation: Certaines librairies peuvent le faire automatiquement, mais le plus souvent nécessite une réécriture manuelle.

il est généralement admis en informatique théorique que tout algorithme récursif peut être transformé en un algorithme itératif. Cela découle du fait que la récursion et l'itération sont toutes deux des formes de Turing-complétude. En d'autres termes, elles peuvent toutes deux être utilisées pour calculer n'importe quelle fonction calculable. Ceci est souvent discuté en termes du Théorème de Church-Turing, bien que le théorème lui-même ne parle pas explicitement de récursion ou d'itération.

Preuves et Arguments Simulation de Pile: On peut utiliser une pile explicite pour simuler la pile d'appel de la récursion, ce qui rend le code essentiellement itératif. Automates à Pile: Les automates à pile peuvent reconnaître le même ensemble de langages que les systèmes récursifs, ce qui suggère que les deux sont équivalents en puissance. Théorème de Kleene: Ce théorème montre que les fonctions récursives et les fonctions définies par des schémas d'itération sont en fait équivalentes en puissance. Exceptions et Nuances La transformation peut entraîner une perte de lisibilité ou d'efficacité en mémoire, selon la manière dont elle est effectuée. Certains types de récursion, comme la récursion mutuelle, peuvent être plus difficiles à convertir en code itératif de manière simple.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment