PythonでF#っぽくマージソート実装
っぽく、というかこの間のF#版をそのまま書いただけだけどw
def length(l): if l == []: return 0 else: return 1 + length(l[1:]) def reverse(l): if l == []: return [] else: return reverse(l[1:]) + [l[0]] def mergesort(comp, l): def merge(l1, l2, res): if (l1, l2) == ([], []): return res elif l1 == []: return reverse(l2) + res elif l2 == []: return reverse(l1) + res else: if comp(l1[0], l2[0]) < 1: return merge(l1[1:], l2, [l1[0]] + res) else: return merge(l1, l2[1:], [l2[0]] + res) def split(l, n): def split2(l, left, c): if l != []: if c < n: return split2(l[1:], [l[0]] + left, c+1) else: return (reverse(left), l) else: raise Exception("invalid list") return split2(l, [], 0) if l == [] or length(l) == 1: return l else: m = length(l) / 2 left, right = split(l, m) return reverse(merge(mergesort(comp, left), mergesort(comp, right), []))