2016-05-03 21 views
0
def combine (l1,l2): 
    if l1 == []: 
     return l2 
    if l2 == []: 
     return l1 
    if l1[0] <= l2[0]: 
     return [l1[0]] + combine(l1[1:], l2) 
    return [l2[0]] + combine(l1, l2[1:]) 

Ich versuche, das eine Funktion mit dem Namen „Art“ zu üben, um rekursiv die Liste zu verschmelzen und gibt eine neue Liste (das Argument nicht mutiert), der enthält jeden Wert aus der Argumentliste, aber in sortiert/Nicht- absteigende Reihenfolge.Wie wird diese Übung durchgeführt?

def sort(l): 
    if l == []: 
     return [] 
    else: 
     l1, l2 = l[0:int(len(l)/2)], l[int(len(l)/2):] 
     s = combine(l1, l2) 
     return sort(s) 

aber es gibt mir immer einen Fehler:

RuntimeError: maximum recursion depth exceeded in comparison 
+0

Diese Art der Sortierung wird [merge sort] (https://en.wikipedia.org/wiki/Merge_sort) genannt. –

+0

Mögliches Duplikat von [Python - Merge Sort Recursive Algorithm] (http://stackoverflow.com/questions/19992992/python-merge-sort-recursive-algorithm) –

Antwort

2

Ihre sort Funktion rekursiv selbst mit der gleichen Größe Eingang über Aufruf und immer wieder, wenn l alle Elemente hat. Dies wird schließlich zu RuntimeError führen. Wenn Sie Ihre Funktion ändern, um die gegebenen list auf zwei, Sortieren der Hälften und kombiniert das Ergebnis funktioniert es wie erwartet zu spalten:

def merge_sort(l): 
    if len(l) <= 1: 
     return l 

    return combine(merge_sort(l[0:len(l)/2]), merge_sort(l[len(l)/2:])) 

Da die obige Funktion teilt den gegebenen list zu zwei der Rekursion endet schließlich, wenn len(l) <= 1.

Verwandte Themen