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

问题描述 投票:0回答:5

问题是当列表具有不同的长度时,知道如何做到这一点吗?

我必须使用

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)
作为结果。谢谢你。

scheme racket higher-order-functions
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]))

2
投票

我假设您期望的行为是只要可能,列表就会交错,然后将非空列表中剩下的内容附加到末尾。在这种情况下,一种可能的实现是

(define (interleave a b)
  (if (null? a)
      b
      (cons (car a)
            (interleave b (cdr a)))))

我认为这可能是编写您要查找的内容的最简单的方法。


1
投票

map
fold-right
都不起作用,因为它们要么在一个列表小于另一个列表时发出错误信号,要么倾向于停在最短的列表上。例如。 SRFI-1地图
(interleave '(1 2 3 4) (circular-list 9 8)) ; ==> (1 9 2 8 3 9 4 8)
。对于不同的行为,您需要自己动手。


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
投票

“没有什么没有什么是你不能做的

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))
© www.soinside.com 2019 - 2024. All rights reserved.