最大サイズ N = ~1950 程度の小さなリストでは、正しい出力が得られます...ただし、それほど大きくないリスト サイズでは、期待される結果ではなくエラーが返されます。私のコード:
def merge(left, right, aux=[]):
if left == []:
for x in right:
aux.append(x)
return aux
elif right == []:
for x in left:
aux.append(x)
return aux
elif left[0] > right[0]:
aux.append(right[0])
return merge(left, right[1:], aux)
else:
aux.append(left[0])
return merge(left[1:], right, aux)
def msort(values):
size = len(values)
if size == 1:
return values
else:
mid = size/2
return merge(msort(values[:mid]), msort(values[mid:]), [])
これらのテスト リストを実行msort
すると、予想される (昇順の) 出力が得られます。
val = [x for x in range(1950, 0, -1)
val = [x for x in range(4,0,-1)]
例 [1,2,3,...,1948,1949,1950] および [1,2,3,4]
ただし、msort
このテスト ケースを実行すると、次のようになります。
val = [x for x in range(2000,0,-1)]
このエラーが表示されます ( への多数のトレースバックの後merge
):
RuntimeError: maximum recursion depth exceeded in cmp
私の質問は次のとおりです。ここでの実装で何が問題になったのですか? N ~ >=2000 のリストでは使用できません。なんで?