最初由 zhynt 发布
[B]这个问题你前面好像问过吧? [/B]
哎呀,不好意思,我找了找,还真问过。
那贴是 http://www.xdcad.net/forum/showthread.php?threadid=128805
我自己也忘了,sorry
aeo的程序不错。上次看的时候还没见贴出来。

- ;| by ---------------aeo
- (defun tt(li n / a return)
- (while li
- (setq a(append a(list(car li)))li(cdr li));一个个来
- (if(=(length a)n)(setq return(cons a return) a nil));满就加入
- )
- (if a(setq return(cons a return)));没满的加入,不想要这句去掉
- (reverse return)
- )
既然这样,那我就把自己的贴上吧。
这个跟上面的结构类似。小区别是 if 判断的条件,虽然省去while下面的一句,但是效率反不如aeo那样写。

- ;(xl_div '(1 2 3 4 5 6 7 8 9 10 11) 3) -> ((1 2 3) (4 5 6) (7 8 9) (10 11))
- (defun xl_div (lst nom / nlst1 nlst)
- (while lst
- (setq nlst1 (append nlst1 (list (car lst))) lst (cdr lst))
- (if (or (= nil lst) (= (length nlst1) nom))
- (setq nlst (append nlst (list nlst1)) nlst1 nil)
- )
- )nlst
- )
用repeat,结构和用while差不多,不过开始可以少做一个判断,效率更高

- (defun xl_div (lst nom / lst1 nlst)
- (repeat (length lst)
- (setq lst1 (append lst1 (list (car lst))) lst (cdr lst))
- (if (= nom (length lst1))
- (setq nlst (append nlst (list lst1)) lst1 nil)
- )
- )(if lst1 (append nlst (list lst1)) nlst)
- )
这个是用mapcar:我觉得中间过程罗嗦了些,不知道还有没有更好的办法。

- (defun xl_div (lst nom / i lst1)
- (apply 'append (mapcar
- '(lambda (x)
- (setq i (if i (1+ i) 1) lst1 (append (if (= 0 (rem (1- i) nom)) nil lst1 ) (list x)))
- (if (or (= i (length lst))(= 0 (rem i nom)))(list lst1) nil)
- )lst
- ) ))
纯粹是想交流一下编程,没用卖弄的意思。 |