将列表拆分为最大长度列表

时间:2017-04-15 20:24:03

标签: scheme lisp racket

例如 我想制作一个列表,下面显示了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))

这样做的最佳方式是什么?

//抱歉我的英语不好。

1 个答案:

答案 0 :(得分: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定义,使用命名的let消除包装器递归:

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