明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1218|回复: 17

[已解答] 求一个表函数

[复制链接]
发表于 2014-11-22 03:34 | 显示全部楼层 |阅读模式
本帖最后由 spiderman 于 2014-11-22 21:30 编辑

请帮忙写一个表函数,要求对某个表中的元素两两相减,求绝对值,去重,得到一个新表,谢谢。
比如表'(14 16 23 7 29),通过两两相减计算得到:
|14-16|=2    |14-23|=9    |14-7|=7        |14-29|=15
|16-23|=7    |16-7|=9      |16-29|=13
|23-7|=16    |23-29|=6
|7-29|=22
去重之后,得到新表'(2 9 7 15 13 16 6 22)

点评

14-7=7,7哪里去了?  发表于 2014-11-22 08:54
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-11-22 08:16 | 显示全部楼层
本帖最后由 USER2128 于 2014-11-22 08:20 编辑

(DEFUN tt (lst / )
  (setq rtn (append rtn (mapcar '(lambda(x) (abs (- (car lst) x))) (cdr lst))))
  (if (cdr lst) (tt (cdr lst)))
  )
(setq lst '(14 16 23 7 29))
(setq rtn nil)
(tt lst)
(vl-sort rtn '<)

发表于 2014-11-22 08:21 | 显示全部楼层
  1. (defun sub_abs(num lst) ;返回数字num减表 lst各元素后的绝对值表
  2. (mapcar '(lambda (x) (abs (- num x))) lst)
  3. )
  4. (defun LstDelSame   (lst / x nl) ;删除表中相同元素
  5.         (foreach        x lst
  6.                 (if (not (member x nl))
  7.                         (setq nl (cons x nl))
  8.                 )
  9.         )
  10.         (reverse nl)
  11. )
  12. (defun lst_sub_abs(lst / l lst_tmp end_lst)  ;满足楼主的函数
  13. (setq lst_tmp lst)
  14. (foreach l lst
  15. (setq end_lst (append end_lst (sub_abs l (setq lst_tmp (cdr lst_tmp) ))))
  16. )
  17. (LstDelSame end_lst)
  18. )


_$ (lst_sub_abs '(14 16 23 7 29))
(2 9 7 15 13 16 6 22)
_$


发表于 2014-11-22 08:56 | 显示全部楼层
  1. (defun abc (lst)
  2.   (vl-sort (xyp-list-delsame
  3.              (mapcar '(lambda (x) (abs (- (car x) (cadr x))))
  4.                      (xyp-List-Combination lst 2)
  5.              )
  6.            )
  7.            '<
  8.   )
  9. )

点评

写漏了7,谢谢指正!  发表于 2014-11-22 21:29
发表于 2014-11-22 10:47 | 显示全部楼层
本帖最后由 冰与火之歌 于 2014-11-22 10:50 编辑

(defun tt(p / lst)
   (setq lst '())
  (while p
   (setq lst (append lst (mapcar '(lambda (x) (if (cdr p) (abs (- (car p) x)))) (cdr p))))
   (setq p (cdr p))
   )
    (vl-sort (vl-remove nil lst) '<)
  )

点评

谢谢高手帮忙,问题解决了。  发表于 2014-11-22 21:39
发表于 2014-11-22 12:22 | 显示全部楼层
本帖最后由 wowan3344 于 2014-11-22 12:49 编辑


1
  1. (defun t11 (l / a b c d)
  2.     (mapcar
  3.         '(lambda(a)
  4.             (mapcar
  5.                 '(lambda(b)
  6.                     (setq c (abs(- b a)))
  7.                     (or (member c d)(setq d (cons c d)))
  8.                 )
  9.                 (setq l (cdr l))
  10.             )
  11.         )
  12.         l
  13.     )
  14.     d
  15. )
2
  1. (defun T12 (l / x)
  2.     (mapcar
  3.         '(lambda(a)
  4.             (mapcar
  5.                 '(lambda(b)
  6.                     (setq x (cons (abs(- b a)) x))
  7.                 )
  8.                 (setq l (cdr l))
  9.             )
  10.         )
  11.         l
  12.     )
  13.     (vl-sort x '<)
  14. )

点评

请教大师。t12.里面lambda (a)和lambda (b) ,是什么关系。怎么不是lambda (a b).这样的区别。谢谢。  发表于 2014-11-22 23:58
葛老是 wowan1314 而且吃黄瓜@  发表于 2014-11-22 22:51
谢谢,看你的ID,莫非是葛老?  发表于 2014-11-22 21:37

评分

参与人数 1明经币 +1 收起 理由
wayne_myles + 1 很给力!

查看全部评分

发表于 2014-11-22 21:43 | 显示全部楼层
本帖最后由 namezg 于 2014-11-22 22:05 编辑

;|
对某个表中的元素两两相减,求绝对值,去重,得到一个新表。
比如表'(14 16 23 7 29),通过两两相减计算得到:
|14-16|=2    |14-23|=9    |14-7|=7        |14-29|=15
|16-23|=7    |16-7|=9      |16-29|=13
|23-7|=16    |23-29|=6
|7-29|=22
去重之后,得到新表'(2 9 7 15 13 16 6 22)
|;
  1. ;(zg-test (setq lst '(14 16 23 7 29)))
  2. ;(2 9 7 15 13 16 6 22)
  3. (defun zg-test (lst / newlst value)
  4.         (mapcar
  5.                 '(lambda (y)
  6.                         (mapcar
  7.                                 '(lambda (x)
  8.                                         (if (not (member (setq value (abs (- y x))) newlst))
  9.                                                 (setq newlst (cons value newlst))
  10.                                         )
  11.                                 )
  12.                                 (setq lst (cdr lst))
  13.                         )
  14.                 )
  15.                 lst
  16.         )
  17.         (reverse newlst)
  18. )

发表于 2014-11-22 23:07 | 显示全部楼层
这个有点看不懂,学习了!

点评

用了两个mapcar , 所以有两个lambda  发表于 2014-11-23 14:38
发表于 2014-11-23 19:55 来自手机 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2014-11-24 08:25 编辑

(defun t1 (lst)
  (if (cdr lst)
    (append (mapcar '(lambda (x y) (abs (- x y))) lst (cdr lst)) (t1 (cdr lst)))
  )
)
(setq lst '(14 16 23 7 29))
(t1 lst)=>(2 7 16 22 7 16 22 16 22 22)

点评

不错 不过输出结果 没有去重  发表于 2021-6-7 20:26
发表于 2014-11-25 14:08 | 显示全部楼层
自贡黄明儒 发表于 2014-11-23 19:55
(defun t1 (lst)
  (if (cdr lst)
    (append (mapcar '(lambda (x y) (abs (- x y))) lst (cdr lst)) ( ...

还是黄大侠的这个最为经典!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 05:20 , Processed in 0.330618 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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