Scheme 知道如何在dr racket中交错两个列表吗?
问题是当列表的长度不同时,你知道怎么做吗 我必须使用map之类的函数 这是我到目前为止编写的代码,它可以处理相同长度的列表,但也需要处理不同长度的列表。多谢各位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
(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))