Scheme 知道如何在dr racket中交错两个列表吗?

Scheme 知道如何在dr racket中交错两个列表吗?,scheme,racket,Scheme,Racket,问题是当列表的长度不同时,你知道怎么做吗 我必须使用map之类的函数 这是我到目前为止编写的代码,它可以处理相同长度的列表,但也需要处理不同长度的列表。多谢各位 (define (interleave list1 list2) (flatten [map (lambda (x y) (cons x (cons y null))) list1 list2])) 如果列表长度不同,我会得到以下结果: 映射:所有列表的大小必须相同;论据是:#’(12345)’(abc) 我正在尝试获取(1A2B3

问题是当列表的长度不同时,你知道怎么做吗

我必须使用map之类的函数

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

(define (interleave list1 list2)
 (flatten [map (lambda (x y) (cons x (cons y null))) list1 list2]))
如果列表长度不同,我会得到以下结果:

映射:所有列表的大小必须相同;论据是:#’(12345)’(abc)


我正在尝试获取(1A2B3C45)

无论是
map
还是
fold right
都不起作用,因为它们要么在一个列表比另一个列表小时发出错误信号,要么在最短的列表处停止。例如,“s
(交错排列’(1234)(循环列表98));=>(1 9 2 8 3 9 4 8)
。对于不同的行为,您需要自己进行操作。

使用简单列表操作函数的解决方案可能是:

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

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

我假设您想要的行为是,列表尽可能地交错,然后将非空列表中剩余的内容追加到末尾。在这种情况下,一种可能的实现是

(定义(交错a b)
(如果(空?a)
B
(a车)
(交织b(cdr a(()())))
我想这可能是写你要找的东西的最简单的方法。

一个牛仔对另一个牛仔说,“你没有什么事不能做的,
对折
,其中一些是有条件的事情。”他向篝火里吐口水,晚上抽雪茄,从粗糙的铁皮杯子里啜饮黑咖啡。“是的,整个该死的世界什么都没有。”


请澄清你的问题:陈述你在做什么,展示你的代码,你在哪里被卡住了,你在努力实现什么。我在尝试交错不同长度的列表。Map函数只接受相同长度的列表,所以问题是它们的长度不同。这就是我试图实现的目标:例如,如果你有两个类似(123456)(abc)的列表,结果应该是(1A2C456)。或者如果你有(1 2 3)(a b c d e f)那么(1 a 2 b 3 c d e f),那么编辑你的问题;)并使用格式化工具突出显示代码。请参阅此处的指导原则:由于代码中也没有注释,您能否随附一些文本:)?
(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))