Scheme 方案将两个列表合并为一个

Scheme 方案将两个列表合并为一个,scheme,Scheme,如何设计将两个列表合并为一个列表的函数。 第一个列表的第一个元素将是新列表的第一个元素,第二个列表的第一个元素将是新列表的第二个元素 (a,b,c,d,e,f)(g,h,i)将是(a,g,b,h,c,i,d,e,f,)这里是R6RS中的纯函数和递归实现 (define (merge l1 l2) (if (null? l1) l2 (if (null? l2) l1 (cons (car l1) (cons (car l2) (merg

如何设计将两个列表合并为一个列表的函数。 第一个列表的第一个元素将是新列表的第一个元素,第二个列表的第一个元素将是新列表的第二个元素
(a,b,c,d,e,f)(g,h,i)将是(a,g,b,h,c,i,d,e,f,)

这里是
R6RS中的纯函数和递归实现

(define (merge l1 l2)
      (if (null? l1) l2
          (if (null? l2) l1
              (cons (car l1) (cons (car l2) (merge (cdr l1) (cdr l2)))))))

您试图实现的过程称为
interleave
merge
。因为这看起来像家庭作业,我不能给你一个直截了当的答案,相反,我会给你指出正确的方向;填空:

(define (interleave lst1 lst2)
  (cond ((null? lst1)     ; If the first list is empty
         <???>)           ; ... return the second list.
        ((null? lst2)     ; If the second list is empty
         <???>)           ; ... return the first list.
        (else             ; If both lists are non-empty
         (cons (car lst1) ; ... cons the first element of the first list
               <???>))))  ; ... make a recursively call, advancing over the first
                          ; ... list, inverting the order used to pass the lists.
(定义(交错lst1 lst2)
(cond((null?lst1);如果第一个列表为空
)返回第二个列表。
((null?lst2);如果第二个列表为空
);…返回第一个列表。
(否则;如果两个列表均为非空)
(cons(carlst1);…cons第一个列表的第一个元素
))))  ; ... 进行递归调用,在第一个
; ... 列表,反转用于传递列表的顺序。

无需检查两个列表:以下是一个简单的版本:

    (define (interleave lx lz)
  (cond
    [(empty? lx) lz]
    [else (cons (first lx)(interleave lz (rest lx)))]))


(check-expect(interleave '() '())'())
(check-expect(interleave '(X X X X X X) '(O O O O O))
             (list 'X 'O 'X 'O 'X 'O 'X 'O 'X 'O 'X))
(check-expect(interleave '(1 2 3) '(a b c d e f))
             (list 1 'a 2 'b 3 'c 'd 'e 'f))

这可以通过一个简单的条件来实现

(define (merge a b)
  (cond ((null? a) b)
        ((null? b) a)
        (else (cons (car a) (merge b (cdr a))))
        ))

@ÓscarLópez:我只是猜测,但下层选民可能会反对“因为这看起来像家庭作业”这一点。我现在也有同样的问题,我正在工作环境中使用scheme。可能是因为假定这是家庭作业的起源问题,所以让落选的选民感到不快。再说一遍,我只是在猜测。@xuinkrbin。我对此表示怀疑,我的很多答案都是假设OP在做作业,并且只给出提示,如上面所述。只要答案是正确的(事实的确如此),就没有理由因为@ÓscarLópez而投反对票:我不反对给出提示是/可以是好的。我只是说反对意见是公开指责。人们通常不喜欢在提出真正无辜的问题时被指责为邪恶。@xuinkrbin。这不是一项指控,但你是对的,有人可能会误会,可能会有点生气,但说实话,这个问题制定得太糟糕了,违反了so的政策(这并没有表明OP的任何努力),它本该如此closed@xuinkrbin. 此外,OP实际上喜欢这个答案,这就是他接受这个答案的原因。其他人投了反对票。我将删除这个答案,似乎没有其他人喜欢它:(