2014-11-04 78 views
0

说你想追加名单和输出的这些列表包含了所有的数字如何追加列表而不使用追加方案?

(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)))])) 

可是如何才能让同输出不使用递归附加?

回答

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) 
+0

@usepla感谢。我并不真正遵循let循环部分。你能做一个简化的版本吗? – ads27 2014-11-04 23:23:08

+0

@pnixsweet您需要熟悉* named let * s。例如,请查看[this](http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-8.html#node_sec_6.2)。 – uselpa 2014-11-05 10:20:29