乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 134|回复: 6

请教一下关于lisp表排序的问题。[求助]

[复制链接]

26

主题

50

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
154
发表于 2002-9-14 17:56:00 | 显示全部楼层 |阅读模式
碰到个棘手的问题——我想构造一个顺序结构的表,不断有新的表项加入,然后和表里已有的表项比较,按照一定的关系排序。使最后这个表的子项是顺序排列的。
  始终找不到好的方法,我用了直接交换排序,但是在交换时老是出状况,:把 2 赋给temp,把 1 赋给 2 ,然后把 temp 赋给 1, 就这么简单的操作都完成不了——我用subst temp 1 时,结果1 和 2 都被替换了。   能不能指定替换第几项(而不是根据第几项的内容)? 还有,谁能告诉我有没有更好的排序的算法? 谢谢。
回复

使用道具 举报

7

主题

611

帖子

9

银币

中流砥柱

Rank: 25

铜币
639
发表于 2002-9-14 21:48:00 | 显示全部楼层
如果用Vlisp就简单了,有相关的函数,好像是Vl-sort。
回复

使用道具 举报

26

主题

50

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
154
发表于 2002-9-15 18:58:00 | 显示全部楼层
就像这样: (setq data (list x y)) (setq data (cons z data))
x、y 、z 都是赋值的数字,且x>y>z 现在加入z后,表data 为(z x y),现在就该交换排序了,得到表(x y z).  然后又加了一个m, (x>m>y) 然后就该得到表(x m y z) 如此继续。按照LL_J的办法,重新构造。当这个表很多项的时候,效率就低了。我想能不能利用链表指针来排序。不知LISP有没有指针这一说。
回复

使用道具 举报

22

主题

248

帖子

10

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
336
发表于 2002-9-16 08:14:00 | 显示全部楼层
(VL-Sort 表 关系式)
对的内容按照的要求进行重新排序,返回新表。中各项的数据类型应当相匹配。
例:(vl-sort '(1.5 2 4 66.4 3 1.5 0.78 1.5) '<)        返回:(0.78 1.5 1.5 1.5 2 3 4 66.4)                 
例:(SetQ newl (vl-sort '(("a" 2) ("b" 4) ("c" 3) ("d" 1))
                     (function (lambda (e1 e2) (< (cadr e1) (cadr e2))))
             )
)
返回:(("d" 1) ("a" 2) ("c" 3) ("b" 4))
摘自《Visual LISP 程序设计——技巧与范例》
回复

使用道具 举报

37

主题

297

帖子

15

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2002-9-16 08:42:00 | 显示全部楼层
我认为,list结构的底层实现应该本来就是一个双向链表,所以排序不会引起数据的移动,只是指针变化。反倒是nth之类的函数,效率比较低,因为会引起遍历
回复

使用道具 举报

37

主题

297

帖子

15

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2002-9-16 22:04:00 | 显示全部楼层

比如,定义一个函数:swap
可以使用类似于C语言的指针返回参数,达到修改参数的目的。
;;; Swap
(defun Swap (_Swap_A _Swap_B / tmp)
  (setq tmp (eval _Swap_A))
  (set _Swap_A (eval _Swap_B))
  (set _Swap_B tmp)
  nil
)
测试:
Command: (setq a "This is A")
"This is A"
Command: (setq b "This is B")
"This is B"
Command: (swap 'a 'b)
nil
Command: !a
"This is B"
Command: !b
"This is A"
回复

使用道具 举报

37

主题

297

帖子

15

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2002-9-16 22:13:00 | 显示全部楼层
;;; Swap
(defun Swap (_Swap_A _Swap_B)
  (mapcar 'set
          (list _Swap_A _Swap_B)
          (mapcar 'eval (list _Swap_B _Swap_A)))
)
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-5-25 21:29 , Processed in 0.707041 second(s), 77 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表