Scheme 方案:如何将一个列表拆分为奇数项和偶数项的两个列表?

Scheme 方案:如何将一个列表拆分为奇数项和偶数项的两个列表?,scheme,mergesort,Scheme,Mergesort,我正在scheme中实现合并排序,我必须通过定义两个助手方法来实现:merge和split “合并”将两个列表(已按递增顺序)合并在一起。我的做法如下: (define merge (lambda (list1 list2) (if (null? list1) list2 (if (null? list2) list1 (if (< (car list1

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

“合并”将两个列表(已按递增顺序)合并在一起。我的做法如下:

(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)))))))
(定义合并)
(lambda(列表1列表2)
(如果(空?列表1)
清单2
(如果(空?列表2)
清单1
(如果(<(车辆清单1)(车辆清单2))
(cons(车辆列表1)(合并(cdr列表1)列表2))
(cons(汽车列表2)(合并(cdr列表2)列表1()()())()()())41
不过,拆分法让我感到困惑。我发现有一个例子可以通过两个单独的方法(“奇数”和“偶数”)实现这一点,但我想知道是否有一种方法可以将这些方法组合成一个名为“拆分”的方法

示例如下:


显然,我对scheme很陌生,有人能帮我理解如何做到这一点吗?

一个简单的
拆分
实现,适合作为
合并排序
的一部分使用,如下所示:

(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)))
另一种选择是,通过使用
分区
,您可以在一次过程中拆分输入列表:

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

请注意,只有当输入列表仅包含整数时,最后两个选项才有用。对于使用自己的
mergesort
实现对其他数据类型的列表进行排序,最好使用我的第一个版本的
split

,谢谢您的评论!但是我正在寻找一个可以做到以下几点的拆分:拆分(123456)=>((1355)(246))在Petite Chez中非常有效!多谢各位much@user1420913不客气!我在最后添加了更多的信息,您应该在实现
mergesort
时考虑到这一点。谢谢!这个实现只需要处理整数列表,所以这是完美的。