有关如何在dr drcket中交错两个列表的任何想法?

时间:2015-05-06 08:53:35

标签: scheme racket

问题是当列表有不同的长度时,是否知道如何操作?

我必须使用像map这样的函数

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

domain=[('type', '=', 'external')]

如果列表长度不同,这就是我得到的:

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

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

5 个答案:

答案 0 :(得分: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 :(得分:2)

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

Runnable

我认为这可能是写出你想要的最简单的方法。

答案 2 :(得分:1)

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

答案 3 :(得分: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)
 > 

我认为这是相当自我记录的。

答案 4 :(得分:0)

"在 一个牛仔对另一个说,spittin'进入篝火和海鹦'在晚上,他的雪茄,sippin'他的黑咖啡从他粗犷的罐子里拿出来。 " Yessa ,nothin'在整个世界中。"

fold-right