2017-04-15 73 views
0

例如 我想列出一個有20個數字的列表,如下所示。單獨的將列表拆分成最大長度列表

(list 1 2 3 4 5 6 7 8 9 10 
     11 12 13 14 15 16 17 18 19 20) 

到列表的列表中,每列表中包含10個數字。就像下面那樣

(list (list 1 2 3 4 5 6 7 8 9 10) 
     (list 11 12 13 14 15 16 17 18 19 20)) 

這樣做的最好方法是什麼?

//對不起,我可憐的英語。

回答

0
(define (take n xs) 
    (if (or (= n 0) 
      (null? xs)) 
     '() 
     (cons (car xs) 
      (take (- n 1) 
        (cdr xs))))) 

(define (drop n xs) 
    (if (or (= n 0) 
      (null? xs)) 
     xs 
     (drop (- n 1) 
      (cdr xs)))) 

(define (split n xs) 
    (if (null? xs) '() 
     (cons (take n xs) 
      (split n (drop n xs))))) 


(display 
    (split 3 (list 1 2 3 4 5))) ; `((1 2 3) (4 5))` 

替代split定義,包裝遞歸的消除使用命名讓:

(define (split n xs) 
    (let spl ((xs' xs)) ; Named let 
     (if (null? xs') '() 
     (cons (take n xs') 
       (spl (drop n xs')))))) 
+0

Thnak你。幫助很多 –