本帖最后由 llsheng_73 于 2022-10-7 18:30 编辑
我一直以来用的是while+repeat的,测试了下,速度确实比先reverse再foreach慢很多,综合了一下几个楼层的代码,得到代码如下,经测试,结果是正确的,速度还行吧,反正我要把我以前的换成下边这个了
- (defun divlst(lst n / l l2)
- (if(< 0 n(length lst))
- (progn
- (repeat(rem(length(setq lst(reverse lst)))n)
- (setq l(cons(car lst)l)lst(cdr lst)))
- (and l(setq l2(cons l l2)l nil))
- (foreach x lst
- (if(=(length(setq l(cons x l)))n)
- (setq l2(cons l l2)l nil)))
- l2)
- (list lst)))
从表头开始,多余的尾巴保持在最后
(DIVLST '(1 2 3 4 5 6 7 8 9 10 11 12 13) 3)=>((1 2 3) (4 5 6) (7 8 9) (10 11 12) (13))
(DIVLST '(1 2 3 4 5 6 7 8 9 10 11 12) 3)=>((1 2 3) (4 5 6) (7 8 9) (10 11 12))
例外情况处理
(DIVLST '(1 2 3 4 5 6 7 8 9 10 11 12 13) 50)=>((1 2 3 4 5 6 7 8 9 10 11 12 13))
(DIVLST '(1 2 3 4 5 6 7 8 9 10 11 12 13) -1)=>((1 2 3 4 5 6 7 8 9 10 11 12 13))
|