问题是当列表具有不同的长度时,知道如何做到这一点吗?
我必须使用
map
之类的函数或类似的东西。
这是我到目前为止编写的代码,它适用于相同长度的列表,但它也需要适用于不同长度的列表:
(define (interleave list1 list2)
(flatten
[map (lambda (x y) (cons x (cons y null)))
list1 list2]))
当列表具有不同长度时,这是我得到的错误:
map: all lists must have same size;
arguments were: #<procedure> '(1 2 3 4 5) '(a b c)
我试图在这里得到
(1 a 2 b 3 c 4 5)
作为结果。谢谢你。
#lang racket
(define (weave xs ys)
(match (list xs ys)
[(list (cons x xs) (cons y ys)) (cons x (cons y (weave xs ys)))]
[(list '() ys) ys]
[(list xs '()) xs]))
我假设您期望的行为是只要可能,列表就会交错,然后将非空列表中剩下的内容附加到末尾。在这种情况下,一种可能的实现是
(define (interleave a b)
(if (null? a)
b
(cons (car a)
(interleave b (cdr a)))))
我认为这可能是编写您要查找的内容的最简单的方法。
使用简单列表操作函数的解决方案可能是:
(define (interleave list1 list2)
(cond ((empty? list1) list2)
((empty? list2) list1)
(else
(append
(list (car list1) (car list2))
(interleave (cdr list1) (cdr list2))))))
测试...
> (interleave '(1 2 3 4 5) '(a b c))
(1 a 2 b 3 c 4 5)
> (interleave '(1 2 3 4 5) '())
(1 2 3 4 5)
> (interleave '() '(a b c))
(a b c)
>
我认为它是相当自我记录的。
“没有什么没有什么是你不能做的
fold-right
,还有一些延续性的东西”,一个牛仔对另一个牛仔说道,一边向篝火里吐口水,一边在他的篝火上吸气。晚上抽雪茄,喝着他那粗糙的锡杯里的黑咖啡。 “是的,先生,这该死的世界里什么都没有。”
(define (interleave xs ys)
;; interleave xs ys = foldr g n xs ys
;; where
;; g x r (y:ys) = x : y : r ys
;; g x r [] = x : r []
;; n ys = ys
((foldr
(lambda (x r)
(lambda (ys)
(cond ((null? ys) (cons x (r '())))
(else (apply (lambda (y . ys)
(cons x (cons y (r ys))))
ys)))))
(lambda (ys) ys)
xs)
ys))