web-dev-qa-db-fra.com

Python Erreur d'exécution Quicksort: profondeur de récursivité maximale dépassée dans cmp

J'écris un programme qui lira un fichier texte contenant 5 163 noms. (le fichier texte peut être vu ici )

Ensuite, je veux stocker les noms dans une liste appelée `` noms '', ensuite, je trie la liste en fonction du nombre de lettres que le nom contient, les noms plus courts sont au début de la liste et les plus longs sont à la fin.

J'ai utilisé quicksort pour trier la liste, mais lorsque je l'exécute, il affiche cette erreur:

C:\Python27\python.exe C:/Users/Lenovo/Desktop/Anagrams/Main.py
Traceback (most recent call last):
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 25, in <module>
    names = quicksort(names)
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 8, in quicksort
    greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 7, in quicksort
    lesser = quicksort([x for x in list[1:] if lessThan(x, pivot)])
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 8, in quicksort
    greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 7, in quicksort
    lesser = quicksort([x for x in list[1:] if lessThan(x, pivot)])
# [.... many lines elided ...]
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 8, in quicksort
    greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 8, in quicksort
    greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 7, in quicksort
    lesser = quicksort([x for x in list[1:] if lessThan(x, pivot)])
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 3, in quicksort
    if list == []:
RuntimeError: maximum recursion depth exceeded in cmp

Le retraçage complet est disponible en tant que pastie .

J'ai testé la fonction quicksort et elle fonctionne pour les listes ordinaires (ex: list = ['Alice', 'Bob,' Carl ',' Derp ']), mais cela ne fonctionne pas si j'essaie de trier les' noms '

Voici mon code

def quicksort(list):
    """Quicksort using list comprehensions"""
    if list == []:
        return []
    else:
        pivot = list[0]
        lesser = quicksort([x for x in list[1:] if lessThan(x, pivot)])
        greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
        return lesser + [pivot] + greater

def lessThan(a, b):
    return len(a) < len(b)

#'''
input = open('Names.txt', 'r')
output = open('Names Arranged By Length.txt', 'w')

names = []

for line in input:
    line = line.translate(None, '\n')
    names.append(line)


names = quicksort(names)

for i in names:
    print i
    output.write(i)
    output.write('\n')

print 'Count: ', len(names)


input.close()
output.close()
#'''

Quel est le problème avec mon code et comment le corriger?

15
DarkPotatoKing

Vous avez simplement atteint les limites de récursivité. Votre liste de noms est trop grande pour les capacités de récursivité limitées de Python. Sinon, votre Quicksort fonctionne très bien.

Vous pourriez augmenter la limite de récursivité en la fixant plus haut avec sys.setrecursionlimit() . Vous pouvez le fixer à un montant plus élevé, mais vous le faites à vos risques et périls.

Une meilleure option est d'utiliser le tri intégré Python; le algorithme TimSort est de loin supérieur et n'atteindra pas une limite de récursivité:

names = sorted(names, key=len)

Cela trie les noms selon leur longueur, les noms les plus courts en premier.

17
Martijn Pieters

Vous dépassez python taille de récursivité par défaut. La limite de récursivité par défaut est 1000. Vous pouvez augmenter la limite de récursivité mais ce n'est pas recommandé. Voici comment faire

import sys
sys.setrecursionlimit(1500)

Suggestion
Ma suggestion est d'utiliser la méthode numpy.argsort () qui est déjà préparée pour de nombreux algorithmes de tri. Voici un exemple simple pour savoir comment faire un algorithme de tri rapide en utilisant la bibliothèque numpy.

6
Harun ERGUL