Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème tri récursif

Anonyme
    9 juillet 2013 à 13:32:27

    Bonjour à tous,

    Avant tout, voici mon code :

    <code type="pycon">
    def sort(arra):
      if len(arra) <= 1:
        return arra
      else:
        return smerge(sort(haf(arra)),sort(hal(arra)))

    def haf(arra):
      arb=[]
      for i in range(0,((len(arra)/2)+1)):
        arb.append(arra[i])
      return arb

    def hal(arra):
      arb=[]
      for i in range(((len(arra)/2)+1),(len(arra))):
        arb.append(arra[i])
      return arb


    def smerge(a,b):
      global num
      c=[]
      i=0
      j=0
      n=len(a)+len(b)
      for k in range(0,n):
        if a[i]<b[j]:
          c.append(a[i])
          i = i+1
        else:
          c.append(b[j])
          j = j+1
          num = num + 1
      return c







    liste=[]
    fichier = open("IA.txt", "r")
    lecture = fichier.readlines()
    N_lignes = len(lecture)
    fichier.close()


    fichier = open("IA.txt", "r")
    for i in range(0,N_lignes):
      lecture = fichier.readline()
      liste.append(lecture)
    fichier.close()


    print(N_lignes)

    num = 0
    liste = sort(liste)
    ##for i in range(0,(len(liste))):
    ##  for j in range(0,i):
    ##    if liste[j]>liste[i]:
    ##      num = num + 1   
    print("Nombre inversions")
    print(num)
    </code>

    Mon but est de trier une liste. Lorsque je lance ce programme, j'ai "RuntimeError: maximum recursion depth exceeded", ce qui signifie sûrement que ma récursion ne s'arrête pas. Mais j'ai aucune idée de ce qui peut faire qu'elle ne s'arrête pas ! J'espère qu'un regard extérieur pourra trouver plus facilement l'erreur que moi, merci d'avances !

    EDIT : Je viens de voir une erreur, mais même lorsqu'elle est corrigée, le problème persiste.

    -
    Edité par Anonyme 9 juillet 2013 à 13:40:51

    • Partager sur Facebook
    • Partager sur Twitter
      9 juillet 2013 à 14:46:07

      je taf légèrement dessus.

      à tu remarqué?

      -le contenus de ta liste contiens toujours tout les saut de ligne sous la forme /n

      -et est entièrement composé de String

      dans le cas ou j'ai mis des nombre dans la IA.txt en passant a la ligne a chaque fois j’obtiens ceci

      >>> liste
      ['1\n', '32\n', '541\n', '55\n', '5\n', '21\n', '2\n', '4\n', '46\n', '6\n', '6\n', '42\n']

      après si ton IA.txt dois contenir autre chose qu'une série de nombre j'aimerai que tu le précise ;)

      • Partager sur Facebook
      • Partager sur Twitter
      l’assiduité est la clef du sucés, mais l'orthographe me tuera...
        9 juillet 2013 à 15:03:18

        pour retirer le /n a chaque élément:

        fichier = open("IA.txt", "r")
        for i in range(0,N_lignes):
          lecture = fichier.readline().strip()
          liste.append(lecture)
        fichier.close()

        il faut rajouté ".strip()" juste après "lecture = fichier.readline()"

        pour des traitement sur des nombre il faudra aussi penser a parsé tout les élément en entier:

        lecture = int(fichier.readline().strip())

        en ajoutant int(....) tu force le contenus en entier, te voila donc avec une liste d'entier!

        -
        Edité par youkoal 9 juillet 2013 à 15:05:33

        • Partager sur Facebook
        • Partager sur Twitter
        l’assiduité est la clef du sucés, mais l'orthographe me tuera...
          9 juillet 2013 à 16:23:39

          cette fonction:

          def haf(arra):
            arb=[]
            for i in range(0,((len(arra)/2)+1)):
              arb.append(arra[i])
            return arb

          peut se réduire par:

          arra[0:(len(arra)/2)]

          et l'autre peut se réduire par:

          arra[(len(arra)/2):]

          ce qui donne:

          def sort(arra):
          if len(arra) <= 1:
          return arra
          else:
          mid=len(arra)/2 #le milieu de ta liste
          return smerge( sort(arra[0:mid]),sort(arra[mid:]) )
          #on utilise la creation de liste de python
          #plus court et moin gourmand en ressources

          avec sa, plus besoin de tes fonction haf() et hal()

          je cherche toujours ou sa coince, étant donné que je ne vois pas exactement ce que tu essai de faire ;)





          • Partager sur Facebook
          • Partager sur Twitter
          l’assiduité est la clef du sucés, mais l'orthographe me tuera...
          Anonyme
            9 juillet 2013 à 16:31:11

            Avant tout, merci de ta réponse !

            Je me suis mis au python qu'aujourd'hui, donc je connais pas toutes les possibilités de ce langage ^^'

            J'avais pas remarqué pour la liste, parce que j'avais parsé avant mais j'ai oublié de le refaire avec la modification ! C'est exactement pour ce genre de remarque que j'avais besoin de quelqu'un d'extérieur. Je corrige ce p'tit bout maintenant. Et effectivement, ce ne sont que des entiers.

            Mais j'ai testé avec des listes d'entier déclarées par moi même, j'ai le même problème.

            Mon but est de trier une liste d'entier strictement différents avec l'algorithme "trifusion".

            Une fois encore, merci de ton aide !

            • Partager sur Facebook
            • Partager sur Twitter
              9 juillet 2013 à 16:53:58

              personnellement, j'adore le python, et j'aime aider, néanmoins, j'essayerai au maximum de t'aider en gardant ton code de base comme squelette.

              le soucis est qu'il est difficile de comprendre et de corriger un code qui ne fonctionne pas ^^"

              • Partager sur Facebook
              • Partager sur Twitter
              l’assiduité est la clef du sucés, mais l'orthographe me tuera...
                9 juillet 2013 à 16:59:55

                def sort(arra):
                  if len(arra) == 0:
                    return []
                  elif len(arra) == 1:
                    return arra
                  else:
                    mid=len(arra)/2 #le milieu de ta liste
                    return smerge( sort(arra[0:mid]),sort(arra[mid:]) )
                    #on utilise la creation de liste de python
                    #plus court et moin gourmand en ressources
                
                
                """
                def haf(arra):
                  arb=[]
                  for i in range(0,((len(arra)/2)+1)):
                    arb.append(arra[i])
                  return arb
                
                def hal(arra):
                  arb=[]
                  for i in range(((len(arra)/2)+1),(len(arra))):
                    arb.append(arra[i])
                  return arb
                """
                
                
                def smerge(a,b):
                  ##global num
                  c=[]
                  i=0
                  j=0
                  la=len(a)
                  lb=len(b)
                  n=len(a)+len(b)
                  for k in range(0,n):
                    if i>=la:
                      c+=b[j:]
                      return c
                    
                    elif j>=lb:
                        c+=a[i:]
                        return c
                      
                    elif a[i]<b[j]:
                      c.append(a[i])
                      i+=1
                    else:
                      c.append(b[j])
                      j+=1
                      ##num = num + 1
                  return c
                
                
                
                
                
                
                
                liste=[]
                fichier = open("IA.txt", "r")
                lecture = fichier.readlines()
                N_lignes = len(lecture)
                fichier.close()
                
                
                fichier = open("IA.txt", "r")
                for i in range(0,N_lignes):
                  lecture = int(fichier.readline().strip())
                  liste.append(lecture)
                fichier.close()
                
                
                print(N_lignes)
                
                num = 0
                
                liste=sort(liste)
                print liste
                
                ##for i in range(0,(len(liste))):
                ##  for j in range(0,i):
                ##    if liste[j]>liste[i]:
                ##      num = num + 1   
                print("Nombre inversions")
                print(num)
                



                comme sa ton code fonctionne (sa tri quoi) par contre reste a recodé le nombre d’inversion etc...

                (je l'es retirer pour ne pas t'induire en erreur avec quelque chose d'à moiter implémenter ;) )

                • Partager sur Facebook
                • Partager sur Twitter
                l’assiduité est la clef du sucés, mais l'orthographe me tuera...
                  9 juillet 2013 à 17:06:02

                  n'hésite pas a me questionné sur n'importe quel partie du code,

                  tout ce qui se trouve entre le triple quote sont des commentaires et peuvent être supprimer:

                  """
                  
                  tes fonctions devenus inutile (désolé pour sa ><)
                  
                  """


                  • Partager sur Facebook
                  • Partager sur Twitter
                  l’assiduité est la clef du sucés, mais l'orthographe me tuera...
                  Anonyme
                    9 juillet 2013 à 17:15:17

                    Merci pour la correction i>la et j>lb, je l'avais oubliée aussi !

                    Sinon, l'élément de milieu du tableau sera pas présent dans les deux listes ?

                    Genre avec ton code, si j'ai la liste [1,2,3,4,5] ça la séparera pas en [1,2,3] et [3,4,5] ?

                    Si oui, alors c'est pas ce que je cherche ^^'

                    Ca trie la liste, sort(liste) retourne la liste triée et doit compter le nombre d'inversions ^^

                    Mais j'ai deux problème, je comprends pas les return c que tu as ajoutés, et quand je remplace le c+=b[j:] par c.append(b[j]) ça me fait du caca !

                    J'aimerais bien que tu m'expliques ça car je suis vraiment débutant en python xD

                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 juillet 2013 à 17:25:27

                      si tu veut je te MP mon skype pour discuter en direct ^^"

                      sinon les return c permettent de quitté la boucle quand tu arrive au bout de l'une des liste en parametre:

                      -tu a parcourus toute la liste X, tu ajoute tout ce qui reste de Y a c et tu retourne c et tu quitte la boucle

                      -tu a parcourus toute la liste Y, tu ajoute tout ce qui reste de X a c et tu retourne c et tu quitte la boucle

                      • Partager sur Facebook
                      • Partager sur Twitter
                      l’assiduité est la clef du sucés, mais l'orthographe me tuera...
                        9 juillet 2013 à 17:30:17

                        soit une liste

                        a=[1,2,3,4,5,4,3,2,1,0]

                        a[0:5] -> une liste allant de l'élément 0 à 5 de la liste a

                        a[5:]   ->une liste allant de l'élément 5 à la fin de la liste a

                        la liste triée contien a coup sure tout les nombre, par contre je regarde pour voir si il n'y a pas duplication ><

                        • Partager sur Facebook
                        • Partager sur Twitter
                        l’assiduité est la clef du sucés, mais l'orthographe me tuera...
                          9 juillet 2013 à 20:00:50

                          Mes yeux me piquent.

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Zeste de Savoir, le site qui en a dans le citron !
                            9 juillet 2013 à 22:54:11

                            ah? pourquoi donc?

                            si il y a quelque chose de mal dans ce que j'ai fais ou écris n'hésite pas! je suis ouvert a la critique :)

                            • Partager sur Facebook
                            • Partager sur Twitter
                            l’assiduité est la clef du sucés, mais l'orthographe me tuera...
                              10 juillet 2013 à 8:15:58

                              Sur le fond je ne vois aucun problème, mais tu devrais vraiment faire un effort sur l'orthographe (c'est dans la charte du site). Pour quelqu'un d'aussi verbeux c'est vraiment choquant (et pénible) de compter une moyenne de 4 fautes par phrase.

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Zeste de Savoir, le site qui en a dans le citron !
                                10 juillet 2013 à 13:39:41

                                j'ai malheureusement conscience du problème...
                                mais comme dis dans la charte du site, je déploie un maximum d'efforts à corriger cela.
                                j'utilise déjà le correcteur syntaxique intégré au système de post et je me relis deux à trois fois.
                                le souci est qu'à 22 ans j'ai passé toute ma petite vie à écrire comme cela et que les erreurs sont plus qu'ancrées en moi.
                                désolé pour ceux à qui je picote les yeux, je fais tout mon possible pour m’améliorer.

                                PS: passé par réverso juste pour toi ;)

                                • Partager sur Facebook
                                • Partager sur Twitter
                                l’assiduité est la clef du sucés, mais l'orthographe me tuera...
                                Anonyme
                                  10 juillet 2013 à 17:16:55

                                  Ok, donc on verra ça par skype demain ! Je posterai la solution ici dans tous les cas, au cas où ça intéresserait des gens ^^
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    11 juillet 2013 à 13:47:26

                                    Salut, 

                                    J'ai rencontré ce problème aussi. J'ai pu le corriger par deux lignes de code. Ce n'est pas forcément ton code qui est faux. Je n'ai pas regardé ton code dans le détail, mais si tu es sûr de ce que tu as écrit et que tu n'as pas peur de faire planter ton ordinateur je te conseil de rajouter ça au dessus de ton code et regarder ce qu'il se passe : 

                                    import resource, sys 
                                    resource.setrlimit(resource.RLIMIT_STACK,(2**29,-1))
                                    sys.setrecursionlimit(10**6)

                                    En fait python empêche de les grosses boucles récursives de fonctionner pour éviter de faire planter ton ordinateur. Tu peux essayer ça et voir si ça fonctionne, ça a fonctionné pour moi. C'est trois lignes permettent de dire à python de laisser faire la boucle récursive. Par contre, je te conseil de vérifier ta mémoire de rame et si elle arrive à plus de 90% - 100% arrête ton programme (ctrl c)

                                    Voilà, bon courage et bonne journée

                                    -
                                    Edité par LilyReve 11 juillet 2013 à 13:50:34

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Votre site est en train de me transformer en geekette... Plus personne va me reconnaitre.
                                      11 juillet 2013 à 18:06:38

                                      Euh a priori pour faire un simple quick sort sur 11 valeurs, s'il atteint la limite de récursion c'est quand même sûrement qu'il y a un zboub dans son code... :-º

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Zeste de Savoir, le site qui en a dans le citron !
                                      Anonyme
                                        11 juillet 2013 à 18:59:55

                                        C'est bon, c'est résolu, et j'l'ai fait tourner sur 100.000 éléments sans prob' ^^
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Problème tri récursif

                                        × 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