Scheme 在方案中打印数字
我试着在下面的列表中做以下事情:假设列表一由(1234)组成,列表二是(5678)。我试着用下面的方式打印它(15263748)。这就是我现在所拥有的,但我不确定接下来该去哪里。当然,现在下面的代码打印出来就像12 34它应该是1 3 2 4Scheme 在方案中打印数字,scheme,racket,Scheme,Racket,我试着在下面的列表中做以下事情:假设列表一由(1234)组成,列表二是(5678)。我试着用下面的方式打印它(15263748)。这就是我现在所拥有的,但我不确定接下来该去哪里。当然,现在下面的代码打印出来就像12 34它应该是1 3 2 4 (define (arrange-list lst1 lst2) (append lst1 lst2)) (arrange-list '(12) '(34)) 这是一个常见的过程,通常称为交织。假设输入列表具有相同的长度,我们可以使用显式递归
(define (arrange-list lst1 lst2)
(append lst1 lst2))
(arrange-list '(12) '(34))
这是一个常见的过程,通常称为
交织
。假设输入列表具有相同的长度,我们可以使用显式递归从头开始编写以下实现:
(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)
如果列表的长度不相等,这是我的解决方案,虽然没有在另一个答案中提到的那么优雅,但它仍然有效 基本上,我们维护一个变量
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)
只是想澄清一下:输入列表看起来像
(1234)
或(1234)
?他们是不同的