在计划中打印数字

时间:2014-04-21 01:32:49

标签: scheme racket

我试图在下面的列表中执行以下操作:假设列表一包含(1234)而列表2是(5678)我试图以下列方式打印它(15263748)这就是我现在所拥有的但我不知道在此后去哪里。当然,现在下面的代码将其打印为12 34,应该是1 3 2 4

   (define (arrange-list lst1 lst2)
  (append lst1 lst2))
 (arrange-list '(12) '(34))

2 个答案:

答案 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)