如何设计一个将两个列表合并为一个列表的功能。第一个列表的第一个元素将是新列表的第一个元素,第二个列表的第一个元素将是新列表的第二个元素 (a,b,c,d,e,f) (g,h, i) 将是 (a,g,b,h,c,i,d,e,f,)
问问题
19405 次
4 回答
13
这是一个纯粹的函数式和递归实现R6RS
(define (merge l1 l2)
(if (null? l1) l2
(if (null? l2) l1
(cons (car l1) (cons (car l2) (merge (cdr l1) (cdr l2)))))))
于 2012-09-28T20:32:16.090 回答
8
您尝试实施的过程称为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.
于 2012-09-28T20:33:06.943 回答
1
无需检查两个列表:这是一个简单的版本:
(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))
于 2016-04-29T20:43:18.233 回答
0
这可以使用一个简单的条件来完成。
(define (merge a b)
(cond ((null? a) b)
((null? b) a)
(else (cons (car a) (merge b (cdr a))))
))
于 2020-10-18T18:55:59.037 回答