Scheme 将列表拆分为两个-一个包含第二个元素,另一个包含所有其他元素

Scheme 将列表拆分为两个-一个包含第二个元素,另一个包含所有其他元素,scheme,Scheme,我正在编写一个递归函数(拆分L) 它获取listL,并返回一个新列表 包含两个子列表,第一个子列表包含L 以及包含不在第一子列表中的剩余元素的第二列表 这里 这些例子说明了 分裂 应: (split ‘(1 2 3 4 5 6 7 8) ) ( (1 3 5 7) (2 4 6 8)) (split ‘(cat bird dog horse mouse pig tiger gerbil cow) ) ( (cat dog mouse tiger cow) (bird horse pig ger

我正在编写一个递归函数
(拆分L)
它获取list
L
,并返回一个新列表 包含两个子列表,第一个子列表包含
L
以及包含不在第一子列表中的剩余元素的第二列表

这里 这些例子说明了 分裂 应:

(split ‘(1 2 3 4 5 6 7 8) )  ( (1 3 5 7) (2 4 6 8))
(split ‘(cat bird dog horse mouse pig tiger gerbil cow) )
( (cat dog mouse tiger cow) (bird horse pig gerbil)) 
下面是我的尝试:

(define split
    (lambda (L)
        (if
            (null? L)
            '()
            (list (first L) (second L))
        )
    )
)

(define first
    (lambda (L)
        (if
            (null? L)
            '()
            (cond
                (
                    (null? (cdr L)) 
                    (car L)
                )
                (
                    #t 
                    (cons
                        (car L)
                        (first (cdr (cdr L)))
                    )
                )
            )
        )
    )
)

(define second
    (lambda (L)
        (if
            (null? L)
            '()
        )
        (cond
            (
                (null? (cdr L))
                '()
            )
            (cons
                (car (cdr L))
                (second (cdr (cdr L)))
            )
        )
    )
)
但我得到的不是预期的结果:

对于
(split'(1234))
我得到
((1234)()

对于
(first'(1234))
我得到
(1234)


对于
(第二个“(1234))
我得到
()

需要考虑的一些事情:

  • 你有括号问题
  • cond
    的最后一个条件中,您应该使用
    else
  • 无需使用
    if
    cond
    ,将所有条件都放在
    cond
    中,这样代码会更清晰
  • first
    中的基本大小写错误,您必须返回一个列表
  • split
    中,您应该使用
    list
    来构建返回的列表,而不是
    cons
  • 你真的,真的应该改进代码的格式-括号不应该单独留在一行中,它们不像其他编程语言中的
    {}
    括号-这将提高代码的可读性
考虑到上述情况,下面是一个解决所有问题的实现:

(define split
  (lambda (L)
    (if (null? L)
        '()
        (list (first L) (second L)))))

(define first
  (lambda (L)
    (cond ((null? L) '())
          ((null? (cdr L)) L)
          (else (cons (car L)
                      (first (cdr (cdr L))))))))

(define second
  (lambda (L)
    (cond ((null? L) '())
          ((null? (cdr L)) '())
          (else (cons (car (cdr L))
                      (second (cdr (cdr L))))))))
现在它如预期的那样工作:

(split '(1 2 3 4 5 6 7 8))
=> '((1 3 5 7) (2 4 6 8))

(split '(cat bird dog horse mouse pig tiger gerbil cow))
=> '((cat dog mouse tiger cow) (bird horse pig gerbil))

我看着这张照片,还记得那张照片。在这里,您只需要一个过程就可以同时执行奇数和偶数列表,而且对于这个问题也确实如此

;; makes a list of every other element
(define (alt lst)
  (if (or (null? lst)
          (null? (cdr lst)))
      lst
      (cons (car lst)
            (alt (cddr lst)))))

;; no safeguard against empty list
;; needs at least one element.
(define (split lst)
  (list (alt lst) (alt (cdr lst))))

(split '(1 2 3 4 5 6 7 8)) 
; ==> ((1 3 5 7) (2 4 6 8))

(split '(cat bird dog horse mouse pig tiger gerbil cow)) 
; ==> ((cat dog mouse tiger cow) (bird horse pig gerbil))

为了保证零元素列表的安全性,我们将其作为一个练习省略

换行符上的每一个右括号都会杀死一只小猫。