Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récursivité python

    20 janvier 2023 à 14:03:39

    Bonjour,

    Lors de l'exécution d'une fonction récursive simple (somme de n entiers consécutifs), la valeur max de n est 992 bien que la taille de la pile soit 1000. Pour n>992, python affiche recursion error. Je voudrais savoir pourquoi la fonction ne peut pas accepter 1000 comme valeur max de n. Est ce qu'il y a d'autres éléments qui sont stockés dans la pile autres que les appels récursifs ce qui limite la taille de n à 992.

    Merci d'avance pour votre réponse.

    • Partager sur Facebook
    • Partager sur Twitter
      20 janvier 2023 à 15:41:23

      Pour gérer l'appel de fonction, python a besoin d'ajouter quelques appels supplémentaires lui aussi...

      Si dans cette fonction récursive, on fait appel à une ou des autres fonctions, ça risque aussi des débordements sur la pile.

      Je suppose que tu n'as pas le choix d'utiliser la récursivité pour des raisons pédagogiques, mais python préfère de loin la méthode itérative, et si tu peux faire une adaptation ça sera sans doute moins risqué quand à l'exécution de ton programme.

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

      Anonyme
        20 janvier 2023 à 17:35:53

        Bonjour,

        Je n'ai pas ce soucis chez moi même plutôt l'inverse :

        import sys
        
        sys.setrecursionlimit(1000)
        
        def toto(n):
            try:
                toto(n+1)
            except RecursionError:
                print(n)
        
        >>> toto(1)
        1012



        • Partager sur Facebook
        • Partager sur Twitter
          20 janvier 2023 à 17:40:40

          On peut toujours changer la limite:
          import sys
          sys.setrecursionlinit(1500)
          Mais il faut s'assurer qu'on n'est pas dans une boucle infinie.
          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            20 janvier 2023 à 17:54:19

            SalmaSalma50 a écrit:

            Bonjour,

            Lors de l'exécution d'une fonction récursive simple (somme de n entiers consécutifs), la valeur max de n est 992 bien que la taille de la pile soit 1000. Pour n>992, python affiche recursion error. Je voudrais savoir pourquoi la fonction ne peut pas accepter 1000 comme valeur max de n. Est ce qu'il y a d'autres éléments qui sont stockés dans la pile autres que les appels récursifs ce qui limite la taille de n à 992.

            La taille de la pile peut être monitorée avec le module inspect et elle est déjà à 1 avant tout appel. Je dirais que lorsque cette valeur atteint 1000, une exception est levée.

            Le code ci-dessous passe

            def s(k):
                return k+s(k-1) if k>1 else 1
            
            s(998)

            mais s(999) ne passe pas.

            • Partager sur Facebook
            • Partager sur Twitter
              22 janvier 2023 à 7:24:00

              Merci bien pour vos réponses.

              Je pense qu'il y a d'autres informations sont stockées dans la pile ce qui justifie le fait d'avoir un nbre inférieur à 993 d'appels récursifs

              • Partager sur Facebook
              • Partager sur Twitter
                22 janvier 2023 à 7:53:03

                ce qui pourrait être intéressant, serait de pouvoir le justifier en montrant un code exemple
                • Partager sur Facebook
                • Partager sur Twitter

                Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                  22 janvier 2023 à 14:44:30

                  SalmaSalma50 a écrit:

                  Je pense qu'il y a d'autres informations sont stockées dans la pile ce qui justifie le fait d'avoir un nbre inférieur à 993 d'appels récursifs


                  Difficile de spéculer là-dessus si tu ne donnes pas ton code complet, ton implémentation de Python (il peut-même y avoir des variations entre la même version de CPython) et ta version de Python.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Récursivité python

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown