Scheme 在方案中打印数字

Scheme 在方案中打印数字,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)) 这是一个常见的过程,通常称为交织。假设输入列表具有相同的长度,我们可以使用显式递归

我试着在下面的列表中做以下事情:假设列表一由(1234)组成,列表二是(5678)。我试着用下面的方式打印它(15263748)。这就是我现在所拥有的,但我不确定接下来该去哪里。当然,现在下面的代码打印出来就像12 34它应该是1 3 2 4

   (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)
?他们是不同的