如何在 Dr Racket 中交错两个列表?

3

当列表长度不同时存在问题,有什么解决办法吗?

我必须使用像map之类的函数

这是我到目前为止编写的代码,它可以处理相同长度的列表,但也需要处理不同长度的列表。谢谢。

(define (interleave list1 list2)
 (flatten [map (lambda (x y) (cons x (cons y null))) list1 list2]))

如果列表长度不同,我得到的结果如下:

map: 所有列表必须具有相同的大小;参数是:# '(1 2 3 4 5) '(a b c)

我试图得到 (1 a 2 b 3 c 4 5)


请澄清您的问题:说明您正在做什么,展示您的代码和卡住的地方,以及您想要实现什么。 - Soma
我正在尝试交错不同长度的列表。Map函数只接受相同长度的列表,所以当它们具有不同长度时就会出现问题。这就是我想要实现的:例如,如果你有两个列表,像(1 2 3 4 5 6) (a b c),结果应该是(1 a 2 b 3 c 4 5 6)。或者如果你有(1 2 3) (a b c d e f),那么结果就是(1 a 2 b 3 c d e f)。 - user3786933
1
所以请编辑您的问题,并使用格式化工具来突出显示您的代码。请参阅此处的指南:http://stackoverflow.com/help/how-to-ask - Soma
5个回答

3
#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]))

1
既然代码中没有注释,你能否配上一些文字说明吗? - Morten Jensen

2
我假设您期望的行为是尽可能交错两个列表,然后将非空列表中剩余的内容追加到末尾。在这种情况下,一个可能的实现方式如下:
(define (interleave a b)
  (if (null? a)
      b
      (cons (car a)
            (interleave b (cdr a)))))

我认为这可能是编写您所需内容的最简单方法。

1
一种使用简单的列表操作函数的解决方案可能是:
 (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)
 > 

我认为它相当自我说明。


1

既不能使用map也不能使用fold-right,因为它们在一个列表比另一个列表短或者它们倾向于停止在最短的列表时会引发错误。例如SRFI-1map (interleave '(1 2 3 4) (circular-list 9 8)) ; ==> (1 9 2 8 3 9 4 8)。如果需要不同的行为,您需要自己编写代码。


0

"用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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接