2014-11-04 101 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