明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1111|回复: 0

[源码] 数字表用最小整数表示升降序

  [复制链接]
发表于 2021-2-20 20:05:50 | 显示全部楼层 |阅读模式
  1. ; 最小整数表示数字表的升降序
  2. ;(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)
  3. (defun nlstch (lst / nlst);lst数字表
  4.   (if (or
  5.   (=
  6.     0
  7.     (apply '+
  8.      (setq nlst (mapcar '(lambda (x) (- x (apply 'min lst))) lst)
  9.        )
  10.      )
  11.     );数字全相等
  12.   (= 1
  13.      (length (setq nlst (mlst lst (zlst lst) '((0)))))
  14.   );数字表为单一升降序
  15.   (setq nlst (plst nlst));其他情况
  16.       )
  17.     (if (= 'list (type (car nlst))) (car nlst) nlst);根据情况输出
  18.   )
  19. )
  20. ;数字表第一次升降顺序 输出1或-1 1为升序-1降序
  21. (defun zlst (lst)
  22.   (if (= (car lst) (cadr lst))
  23.     (zlst (cdr lst))
  24.     (if  (> (car lst) (cadr lst))
  25.       -1
  26.       1
  27.     )
  28.   )
  29. )
  30. ;按照升降序切割表并用自然数表示升降序
  31. (defun mlst (lst key nlst);lst数字表 key上一次升降序1/-1 初始值为lst第一次升降序 nlst尾递归输出 初始值为'((0))
  32.   (if (cdr lst);判断递归完毕
  33.     (cond ((= (car lst) (cadr lst))  ;与上一值相等时
  34.      (mlst (cdr lst)    ;删去第一个数
  35.      key      ;key值不变
  36.      (cons (cons (caar nlst) (car nlst)) (cdr nlst))
  37.           ;将表示上一值的自然数置于nlst第一个表的最前
  38.      )
  39.     )
  40.     ((minusp (* key (- (cadr lst) (car lst))))
  41.           ;之前的升降与上一值的升降序不一致时
  42.      (mlst (cdr lst)
  43.      (- key);将key值相反
  44.      (cons (list (- key) 0);新建一个表置于nlst最前
  45.            nlst
  46.      )
  47.      )
  48.     )
  49.     (t ;之前的升降与上一值的升降序一致时
  50.      (mlst (cdr lst)
  51.      key
  52.      (cons (cons (+ key (caar nlst)) (car nlst));将nlst第一个表的第一个值加上key并置于最前
  53.            (cdr nlst)
  54.      )
  55.      )
  56.     )
  57.     )
  58.     (reverse ;翻转处理过的nlst表
  59.       (mapcar
  60.   '(lambda (x)
  61.      (reverse (mapcar '(lambda (y) (- y (apply 'min x))) x));将nlst内的表值设置为正并翻转
  62.    )
  63.   nlst
  64.       )
  65.     )
  66.   )
  67. )
  68. ;对mlst处理过的表进行合并
  69. (defun plst (lst)
  70.   (if (cdr lst);判断递归完毕
  71.     (if  (>= (last (car lst)) (caadr lst));第一个表的末值比后一个表的首值大于或等于时
  72.       (append (car lst) (plst (cons (cdadr lst) (cddr lst))));将第一张表储存,后一个表去掉首值进行下一次递归
  73.       (append (subst (caadr lst) (last (car lst)) (car lst))
  74.         (plst (cons (cdadr lst) (cddr lst)));第一个表的末值比后一个表的初值小于时将 第一张表最大值变为后表的最大值并储存,后一个表去掉首值进行下一次递归
  75.       )
  76.     )
  77.     (car lst);并入去掉首值的末表
  78.   )
  79. )


评分

参与人数 1明经币 +1 收起 理由
tryhi + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-17 06:31 , Processed in 0.159680 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表