我正在编写Scheme中的mergesort,我很好奇为什么这不起作用......
这是我希望实现的实现,但不是:
(define (mergesort op l)
(cond ((null? l) l)
((null? (cdr l)) l)
(else (merge op (car l)
(mergesort op (cdr l))))
)
)
这是'正确'的实施。
(define (mergesort op l)
(cond ((null? l) l)
((null? (cdr l)) l)
(else (merge op (cons (car l) (list))
(mergesort op (cdr l))))
)
)
为什么我必须(cons(car l)(list))在尝试将它与递归合并之前?
答案 0 :(得分:4)
请注意:
(cons (car l) (list))
......等同于:
(list (car l))
换句话说,您必须使用单个元素传递列表,而不仅仅是元素作为merge
过程的第二个参数。
答案 1 :(得分:2)
奥斯卡是完全正确的,但有一件事情被忽略了。
这不是mergesort。 mergesort的定义是什么?它接受列表,将其拆分为一半,对每个排序列表进行排序,然后将它们合并在一起。
你没有分成两半;你分成了一个,其余的。然后对其余部分进行排序,并将单个元素合并到列表中。但您可以考虑将单个元素合并到列表中,将元素插入列表中。
啊,有一个线索!你写过insertion sort。哪个罚款;有用。它效率低得多。因此,mergesort和插入排序之间的区别在于选择错误的位置来拆分列表。