如何在不使用附加方案的情况下附加列表列表?

时间:2014-11-04 21:34:58

标签: scheme

假设您要附加这些列表列表并输出包含所有数字的单个列表

(append-lists (list (list 1 2) 
                    (list 4 5) 
                    (list 10 19))) =>    (list 1 2 4 5 10 19) 

如果使用琐碎的追加,我可以这样做,

((define (append-lists llon)
     (cond
        [(empty? llon) empty]
        [(cons? llon)  (cons (first llon)
                       (append-lists (rest llon)))]))

但是如何在不使用递归附加的情况下获得相同的输出?

1 个答案:

答案 0 :(得分:2)

这是展平的一个特例。一些Scheme实现具有内置flatten过程;如果没有,一般的展平算法是:

(define (flatten sxp)
  (let loop ((sxp sxp) (res '()))
    (cond
      ((null? sxp) res)
      ((pair? sxp) (loop (car sxp) (loop (cdr sxp) res)))
      (else        (cons sxp res)))))

测试:

> (flatten (list (list 1 2) (list 4 5) (list 10 19)))
'(1 2 4 5 10 19)
> (flatten (list (list 1 2) 'a (list 4 5) 'b (list 10 19)))
'(1 2 a 4 5 b 10 19)