 - ; 最小整数表示数字表的升降序
- ;(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);并入去掉首值的末表
- )
- )
|