数字表用最小整数表示升降序
; 最小整数表示数字表的升降序;(1 2 3 4 4 5 9 5 4 2 1 1 5 9 9)-->(0 1 2 3 3 4 5 3 2 1 0 0 1 2 2)
(defun nlstch (lst / nlst);lst数字表
(if (or
(=
0
(apply '+
(setq nlst (mapcar '(lambda (x) (- x (apply 'min lst))) lst)
)
)
);数字全相等
(= 1
(length (setq nlst (mlst lst (zlst lst) '((0)))))
);数字表为单一升降序
(setq nlst (plst nlst));其他情况
)
(if (= 'list (type (car nlst))) (car nlst) nlst);根据情况输出
)
)
;数字表第一次升降顺序 输出1或-1 1为升序-1降序
(defun zlst (lst)
(if (= (car lst) (cadr lst))
(zlst (cdr lst))
(if(> (car lst) (cadr lst))
-1
1
)
)
)
;按照升降序切割表并用自然数表示升降序
(defun mlst (lst key nlst);lst数字表 key上一次升降序1/-1 初始值为lst第一次升降序 nlst尾递归输出 初始值为'((0))
(if (cdr lst);判断递归完毕
(cond ((= (car lst) (cadr lst));与上一值相等时
(mlst (cdr lst) ;删去第一个数
key ;key值不变
(cons (cons (caar nlst) (car nlst)) (cdr nlst))
;将表示上一值的自然数置于nlst第一个表的最前
)
)
((minusp (* key (- (cadr lst) (car lst))))
;之前的升降与上一值的升降序不一致时
(mlst (cdr lst)
(- key);将key值相反
(cons (list (- key) 0);新建一个表置于nlst最前
nlst
)
)
)
(t ;之前的升降与上一值的升降序一致时
(mlst (cdr lst)
key
(cons (cons (+ key (caar nlst)) (car nlst));将nlst第一个表的第一个值加上key并置于最前
(cdr nlst)
)
)
)
)
(reverse ;翻转处理过的nlst表
(mapcar
'(lambda (x)
(reverse (mapcar '(lambda (y) (- y (apply 'min x))) x));将nlst内的表值设置为正并翻转
)
nlst
)
)
)
)
;对mlst处理过的表进行合并
(defun plst (lst)
(if (cdr lst);判断递归完毕
(if(>= (last (car lst)) (caadr lst));第一个表的末值比后一个表的首值大于或等于时
(append (car lst) (plst (cons (cdadr lst) (cddr lst))));将第一张表储存,后一个表去掉首值进行下一次递归
(append (subst (caadr lst) (last (car lst)) (car lst))
(plst (cons (cdadr lst) (cddr lst)));第一个表的末值比后一个表的初值小于时将 第一张表最大值变为后表的最大值并储存,后一个表去掉首值进行下一次递归
)
)
(car lst);并入去掉首值的末表
)
)
页:
[1]