方案:如何将列表拆分为两个奇数条目和偶数条目列表?

时间:2012-11-13 01:03:44

标签: scheme mergesort

我在方案中实现合并排序,我必须通过定义两个辅助方法来实现:merge和split。

Merge采用两个列表(已按递增顺序)并将它们合并在一起。我这样做了如下:

(define merge 
   (lambda (list1 list2)
       (if (null? list1)
          list2
             (if (null? list2)
                list1
                   (if (< (car list1) (car list2))
                      (cons (car list1) (merge (cdr list1) list2))
                      (cons (car list2) (merge (cdr list2) list1)))))))

分裂方法让我很难过。我找到了一个用两个单独的方法('odd-numbers'和'even-numbers')完成这个的例子,但是我想知道是否有办法将这些方法组合成一个叫做'split'的方法?

此处的示例:merge sort in scheme

我显然对计划很新,任何人都可以帮我理解如何做到这一点吗?

1 个答案:

答案 0 :(得分:3)

适合用作split一部分的简单mergesort实现如下:

(define (split lst)
  (let ((half (quotient (length lst) 2)))
    (list (take lst half)
          (drop lst half))))

它将输入列表分成两半,将它们返回到列表列表中 - 第一个列表对应于前半部分,第二个列表对应于输入列表的后半部分。

根据问题的要求,另一个替代方案是将列表拆分为奇数/偶数元素,如下所示:

(define (split lst)
  (list (filter odd? lst)
        (filter even? lst)))

另一种选择,通过使用partition,您可以在一次传递中拆分输入列表:

(define (split lst)
  (let-values (((odds evens) (partition odd? lst)))
    (list odds
          evens)))

请注意,如果输入列表仅包含整数,则最后两个选项将仅用于 ,以便使用您自己的mergesort实现对其他数据类型的列表进行排序,你'最好使用我的第一版split