乐筑天下

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

如何交换一个表中任意两项的位置

[复制链接]

5

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
34
发表于 2002-8-21 15:13:00 | 显示全部楼层 |阅读模式
有一任意表,例如 ("a" "b" "c" "d" "e" "f"),我想要交换其中的任意两项的位置,比如第二项 "b" 和第五项 "e",应返回 ("a" "e" "c" "d" "b" "f"),我想这个问题应该并不难,可是我试过很多方法,都觉得不太好。谁有比较好的方法请赐教。
回复

使用道具 举报

5

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
34
发表于 2002-8-21 15:46:00 | 显示全部楼层
我用的方法是:
(defun l-par-swap (par n1 n2 / p n return)
        (setq n 0)
        (foreach p par
                (if (= n n1) (setq p (nth n2 par)) )
                (if (= n n2) (setq p (nth n1 par)) )
                (setq return (append return (list p)) )
                (setq n (+ n 1))
        )
        (setq return return)
)
它的时间性能不好,当表的长度大于1000后,所用时间不能忍受。
回复

使用道具 举报

8

主题

56

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
88
发表于 2002-8-21 17:44:00 | 显示全部楼层
(defun swap(plist n1 n2 / v1 v2
  (setq v1 (nth n1 plist)
        v2 (nth n2 plist)
        plist (subst 特殊值 v1 plist)
        plist (subst v1 v2 plistt)
        plist (subst v2  特殊值 plist)
  )
  plist
)
;这样,当表较大时速度会快些
回复

使用道具 举报

5

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
34
发表于 2002-8-22 09:06:00 | 显示全部楼层
谢谢您的建议!
这个方法我也试过了,但是使用起来有很多限制。
1。要求原表中的各项维一,不能有相同的项。
2。特殊值的选取要根据实际情况而定,它不能和原表中的任一项相同。
所以,这个方法不能作为一个通用的子程序来使用。
请问大家,有没有更通用一点的方法。
回复

使用道具 举报

5

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
34
发表于 2002-8-23 09:13:00 | 显示全部楼层
利用member和append来返回好像也可以,程序如下:
(defun swap (par n1 n2 / m1 m2 par1 l p1 p2 p3 return)
        (setq m1 (nth n1 par)
              m2 (nth n2 par)
              par1 (reverse par)
              l (length par)
              p1 (cdr (member m1 par1))
              p2 (cdr (member m1 par))
              p3 (cdr (member m2 par))
        )
        (while (> (length p1) n1) (setq p1 (cdr (member m1 p1))) )
        (while (> (length p2) (- l n1 1)) (setq p2 (cdr (member m1 p2))) )
        (setq p2 (cdr (member m2 (reverse p2))) )
        (while (> (length p2) (- n2 n1 1)) (setq p2 (cdr (member m1 p2))) )
        (while (> (length p3) (- l n2)) (setq p3 (cdr (member m2 p3))) )
        (print (reverse p1))
        (print (reverse p2))
        (print p3)
        (setq return (append (reverse p1) (list m2) (reverse p2) (list m1) p3))
);swap
但是如果原表中多数项都相同时,性能并不比用foreach好。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-5-25 16:22 , Processed in 0.682071 second(s), 62 queries .

© 2020-2025 乐筑天下

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