我试图在下面的列表中执行以下操作:假设列表一包含(1234)而列表2是(5678)我试图以下列方式打印它(15263748)这就是我现在所拥有的但我不知道在此后去哪里。当然,现在下面的代码将其打印为12 34,应该是1 3 2 4
(define (arrange-list lst1 lst2)
(append lst1 lst2))
(arrange-list '(12) '(34))
答案 0 :(得分:1)
这是一个常见的程序,通常称为interleave
。假设输入列表具有相同的长度,我们可以使用显式递归从头开始编写以下实现:
(define (interleave lst1 lst2)
(if (null? lst1)
'()
(cons (car lst1)
(interleave lst2 (cdr lst1)))))
诀窍是从一个列表中取出一个元素,然后从另一个列表中取出,直到两个列表都用完为止。在Racket中更惯用的解决方案是使用内置程序,如下所示:
(define (interleave lst1 lst2)
(flatten (map cons lst1 lst2)))
无论哪种方式都按预期工作:
(interleave '(1 2 3 4) '(5 6 7 8))
=> '(1 5 2 6 3 7 4 8)
答案 1 :(得分:0)
如果列表长度不相等,这是我的解决方案,尽管不像其他答案中提到的那样优雅。
基本上,我们维护变量x
,同时递归调用指示当前哪个列表需要处理的过程。第一个列表由1
表示,第二个列表由2
表示。
(define (print-alt A B x)(cond
((and (null? A) (null? B)) '())
((= 1 x) (cond
((null? A) (print-alt A B 2))
(else (append (list (car A)) (print-alt (cdr A) B 2)))))
(else (cond
((null? B) (print-alt A B 1))
(else (append (list (car B)) (print-alt A (cdr B) 1)))))))
这是输出:
(print-alt (list 1 2 3 4 5 6) (list 5 6 7 8 9 10 11 12 123) 1)
(1 5 2 6 3 7 4 8 5 9 6 10 11 12 123)