2017-04-15 94 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你。帮助很多 –