本帖最后由 Gu_xl 于 2010-12-31 08:06 编辑
修正一下,当表长小于6个时的错误!请大家测试- ;;; (averagelst '(1 2 3 5 10 5 6 8 3 12)) 返回 '((1 3 6 8) (3 5 10) (2 5 12)) (setq lst '(1 2 3 5 10 5 6 8 3 12))
- (defun averagelst (lst / lst1 lst2 lst3 lst4 rtn i )
- ;;;表从小到大排序
- (setq lst1 (gxl-sort lst '(lambda (e1 e2) (> e1 e2))))
- (if (< (length lst1) 4)
- (setq rtn (reverse (mapcar 'list lst1)))
-
- (progn
-
- ;;;表lst1 拆分长度为3 的表
- (setq lst1 (reverse (GXL-LST-SPLIT lst1 3)))
- ;;;表长度如不是3的倍数,拆分为两个表lst1 和lst2
- (if (/= 3 (length (car lst1)))
- (setq lst2 (reverse (car lst1))
- lst1 (mapcar 'reverse (cdr lst1))
- )
- )
- (setq i -1)
- ;;;各组数据按奇偶位置的不同进行大小反序
- (setq lst1 (mapcar '(lambda (x) (if (= (rem (setq i (1+ i)) 2) 1) (reverse x) x)) lst1))
- (if (= 0 (rem (length lst1) 2))
- ;;;lst1表个数为偶数,依次组表
- (setq rtn (apply 'mapcar (cons 'list lst1)))
- ;;;lst1表个数为奇数,取出第一个表,剩下的依次组表
- (progn
- (if (/= (length lst1) 1)
-
- (setq lst3 (car lst1)
- lst1 (cdr lst1)
- )
- )
- ;;;取出第一个表,剩下的依次组表
- (setq rtn (apply 'mapcar (cons 'list lst1)))
- ;;;按各组数据的和从小到大排序
- (setq rtn (GXL-SORT rtn '(lambda (e1 e2) (< (apply '+ e1) (apply '+ e2)))))
- (if lst3
- (progn
- ;;;取出第的一个表从大到小排序
- (setq lst3 (GXL-SORT lst3 '(lambda (e1 e2) (> e1 e2))))
- ;;;将lst3加入组表
- (setq rtn (mapcar 'cons lst3 rtn))
- )
- )
- )
- )
- ;;;按各组数据的和从小到大排序
- (setq rtn (gxl-sort rtn '(lambda (e1 e2) (< (apply '+ e1) (apply '+ e2)))))
- ;;;对剩余lst2表组表
- (if lst2
- (if (= 1 (length lst2))
- (setq rtn (cons (cons (car lst2) (car rtn)) (cdr rtn)))
- (if (= 2 (length lst2))
- (setq lst4 (car rtn)
- lst5 (cadr rtn)
- rtn (cddr rtn)
- lst4 (cons (car lst2) lst4)
- lst5 (cons (cadr lst2) lst5)
- rtn (append (list lst4 lst5) rtn)
- )
- )
-
-
- )
- )
- )
- )
- rtn
- )
|