订购一对列表

时间:2013-11-09 15:25:13

标签: recursion scheme

任何人都可以给我一个精心编写的实现,如何使用辅助函数(基于每对的汽车价值)在方案中订购对的列表?例如,'((3 2)(1 2)(8 4)(0 6))应按'((0 6)(1 2)(3 2)(8 4))排序。这似乎是一件很简单的事情,但出于某种原因,我正在画一个空白。

1 个答案:

答案 0 :(得分:1)

首先,您可以使用自己喜欢的内置sort例程,并指定按car排序,例如在共同的LISP中

(sort ls #'< :key #'car)

如果您的Scheme无法指定key,您可以通过比较程序模拟这个

(sort ls (lambda (a b) (< (car a) (car b))))

第二,如果你想重新实现这个,你可以使用mergesort的方法:将你的列表分成单调增加部分,然后成对地合并它们,直到只剩下一个。在Haskell,

mergesortBy f xs 
   | null xs       = []
   | [s] <- until (null.tail) (pairwise (mergeBy f)) (breakup xs) = s
pairwise g (a:b:t) = g a b : pairwise g t
pairwise _ t       = t
breakup xs         = [[x] | x <- xs] -- a list of (a list of x) for x in xs

由于这些部分单调增加(或至少不减少),mergeBy可以轻松实现。

当然,写得很好&#34;实现将用初始阶段替换这里显示的基本breakup,初始阶段将尝试生成更长的块,保留非递减和反转非增加的块(Haskell示例为here) 。 pairwisemergeBy(以及甚至breakup)函数必须融合为一个,以使整体实现更多在线,因为Scheme是(通常)严格(即非懒惰)语言。您可以在要合并的内部列表中使用显式挂起,以便从排序列表is an O(n) operation中取出一些第一个元素。