2016-05-03 8 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:]) 

"sort"という名前の関数を定義して再帰的にリストをマージし、引数リストからすべての値を含む新しいリスト(引数を変更しない)を返します。ソートされた/降順。この種の練習を行うには?

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) 

はしかし、それは常に私にエラーを与える:lは、任意の項目を持っている場合

RuntimeError: maximum recursion depth exceeded in comparison 
+0

この種類の並べ替えは、[マージソート](https://en.wikipedia.org/wiki/Merge_sort)と呼ばれます。 –

+0

[Python - Merge Sort Recursive Algorithm]の可能な複製(http://stackoverflow.com/questions/19992992/python-merge-sort-recursive-algorithm) –

答えて

2

あなたsort関数が再帰的に何度も何度も同じサイズの入力で自身を呼び出しています。最終的にはRuntimeErrorになります。あなたはそれが期待どおりに動作結果の半分をソートし、組み合わせ、2に与えられたlistを分割するあなたの機能を変更した場合:上記の関数は、2つに与えられたlistを分割しているので

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:])) 

を再帰は、最終的len(l) <= 1ときに終了します。