如何合并两个长度相等的列表,创建一个相互交织的元素列表?
例如,列出2, 4, 6
并1, 3, 5
应2, 1, 4, 3, 6, 5
在球拍中产生。
我很难弄清楚这一点。
如果您想了解Racket包含的电池方面:
#lang racket
(define (intertwine L1 L2)
(flatten (map cons L1 L2)))
快速测试。
> (intertwine '(2 4 6) '(1 3 5))
'(2 1 4 3 6 5)
NOTE适用于相同大小的列表,每个问题。不会像@GoZoner 的回答那样处理长度差异。
重新实现函数是练习小型编程的好方法。学习这个库将允许更高的生产力和更简洁的代码。恕我直言
这类问题的一般方法是解决第一个元素的问题,然后递归解决其余的问题。如果你解决了这个问题:
(zip '(2) '(1))
那么递归看起来像这样(首先表达终止条件):
(define (zip list1 list2)
(cond ((null? list1) list2)
((null? list2) list1)
(else (cons (car list1)
(cons (car list2)
(zip (cdr list1) (cdr list2)))))))
> (zip '(a b c) '(1))
(a 1 b c)
> (zip '(a b c) '(1 2 3))
(a 1 b 2 c 3)
> (zip '(a) '(1 2 3))
(a 1 2 3)
注意这两个null?
子句。这允许list1
或list2
成为不同的大小;剩下的都附加到最后。