找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1602|回复: 21

[求助] 表的比较问题

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2013-6-10 23:52:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一个递增的表  a= '(3 6 12 55 156 224 456 605 772 888 1230)
一个任意参数比如  n = 300
如何用一个函数快速判断 n 在该表中处于的位置?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-6-11 01:11:14 来自手机 | 显示全部楼层
本帖最后由 牢固 于 2013-6-11 08:37 编辑

[pcode=lisp,true]
(defun f (a n)
    (setq i -1)
    (vl-some '(lambda(x)(setq I (1+ i))(< n x)) a)
    i
)
[/pcode]

点评

总觉的循环里少放代码会快点! 所以稍加改造。简单测试了下也可以!  详情 回复 发表于 2013-6-11 15:25
还有vl-some这个函数啊,长见识了  详情 回复 发表于 2013-6-11 11:14
G版,如果元素没在表中,是不是结果就不对了?  详情 回复 发表于 2013-6-11 08:38

评分

参与人数 1D豆 +5 收起 理由
QiaoCheng + 5 呵呵,G版的更简洁

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

发表于 2013-6-11 01:02:33 | 显示全部楼层
本帖最后由 QiaoCheng 于 2013-6-11 01:21 编辑

试试 Highflybird
  二叉树查找函数
http://www.xdcad.net/forum/thread-668753-1-1.html

或者用这个
[pcode=lisp,true]
;; | 功能: 列表中不确定性元素存在的检查                                    
;; | 参数: 'ele'    - 检查的元素                                          
;; |       'Lst'    - 检查的列表                                          
;; |       'diff'   - 实数,一个模糊公差                                    
;; | 返回: 有相同的成员则返回列表中相同的位数,无相同则返回nil              
;; | 测试: (LI_memb "1.3" '("1.2" "1.1" "1.3" "1.4") 0.0001) = 1           
;;(setq a '(3 6 12 55 156 224 456 605 772 888 1230))
;;;(LI_memb 156 a 0.0001)
(defun LI_memb (ele Lst diff / len cnt Found)
  (if (zerop Diff) ;检查Diff的值是否为0,如果Diff等于零则返回 T,否则返回 nil
    (progn
       (setq Found (member ele Lst))
       (if Found (setq Found T))
    )
    (progn
       (setq len (length Lst)
             cnt 0
             Found nil
       )
       (while (and (< cnt len) (not Found))
          (if (equal ele (nth cnt Lst) diff)
              (setq Found T)
              (setq cnt (1+ cnt))
          )
       )
    )
  )
  (if Found cnt nil)
)
[/pcode]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2013-6-11 02:38:11 | 显示全部楼层
感谢!
又学到一个函数 vl-some
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-11 08:38:24 | 显示全部楼层
牢固 发表于 2013-6-11 01:11
(defun f (a n)
    (setq i -1)
    (vl-some '(lambda(x)(setq I (1+ i))(< n x)) a)

G版,如果元素没在表中,是不是结果就不对了?

点评

楼主的本意就是元素不一定在表中!  详情 回复 发表于 2013-6-11 10:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-6-11 10:27:10 | 显示全部楼层
本帖最后由 牢固 于 2013-6-11 10:29 编辑
Lispboy 发表于 2013-6-11 08:38
G版,如果元素没在表中,是不是结果就不对了?

楼主的本意就是元素不一定在表中!譬如楼主给的例子 n = 300 介于224 和456之间,返回值应为 6

点评

G版,这个我认为既然是排序的表了,用折半查找法效率能提升很多。  详情 回复 发表于 2013-6-11 12:07
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3256个

财富等级: 富可敌国

发表于 2013-6-11 11:14:27 | 显示全部楼层
牢固 发表于 2013-6-11 01:11
(defun f (a n)
    (setq i -1)
    (vl-some '(lambda(x)(setq I (1+ i))(< n x)) a)

还有vl-some这个函数啊,长见识了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-11 12:07:55 | 显示全部楼层
牢固 发表于 2013-6-11 10:27
楼主的本意就是元素不一定在表中!譬如楼主给的例子 n = 300 介于224 和456之间,返回值应为 6

G版,这个我认为既然是排序的表了,用折半查找法效率能提升很多。

点评

理论上是如此! 但对于此例,实际上并非如此吧! 折半查找,起码每次要取出中间的元素吧,根据Lisp七大公理,还不是要通过Car cdr 等基本函数从头遍历到该元素!Vl-som只是从头遍历到要找到的位置就结束了,只经过  详情 回复 发表于 2013-6-11 14:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3884个

财富等级: 富可敌国

发表于 2013-6-11 12:32:29 | 显示全部楼层
  1. (- (length Lst) (length (vl-member-if '(lambda (x)
  2.                                          (<= n x)
  3.                                        )
  4.                         ) lst
  5.                 )
  6. )



点评

你不能把a改成lst吗?  详情 回复 发表于 2013-6-11 18:31
没细看! 写出来的跟你写的一样了! 缘分啊。  发表于 2013-6-11 15:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-6-11 14:31:04 | 显示全部楼层
XDSoft 发表于 2013-6-11 12:07
G版,这个我认为既然是排序的表了,用折半查找法效率能提升很多。

理论上是如此!
但对于此例,实际上并非如此吧!
折半查找,起码每次要取出中间的元素吧,根据Lisp七大公理,还不是要通过Car cdr 等基本函数从头遍历到该元素!Vl-som只是从头遍历到要找到的位置就结束了,只经过一遍 遍历!我想还是vl-some快吧!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-11 15:25:16 | 显示全部楼层
牢固 发表于 2013-6-11 01:11
(defun f (a n)
    (setq i -1)
    (vl-some '(lambda(x)(setq I (1+ i))(< n x)) a)

总觉的循环里少放代码会快点! 所以稍加改造。
  1. (defun T2 (a n)
  2.   (- (length a) (length (vl-member-if '(lambda(x)(< n x)) a)))
  3. )
简单测试了下也可以!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3864个

财富等级: 富可敌国

发表于 2013-6-11 18:11:12 | 显示全部楼层
还有这个函数也行:(vl-position  symbol list)
(setq a  '(3 6 12 55 156 224 456 605 772 888 1230))
(vl-position 3 a)
(vl-position 888 a)
(vl-position 300 a)
(3 6 12 55 156 224 456 605 772 888 1230)
0
9
nil
_$

点评

你还没理解楼主的题意!  详情 回复 发表于 2013-6-11 19:13
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3884个

财富等级: 富可敌国

发表于 2013-6-11 18:31:01 | 显示全部楼层

:lol 你不能把a改成lst吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3864个

财富等级: 富可敌国

发表于 2013-6-11 18:38:47 | 显示全部楼层
无所谓:lol
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-6-11 19:13:44 | 显示全部楼层
dnbcgrass 发表于 2013-6-11 18:11
还有这个函数也行:(vl-position  symbol list)
(setq a  '(3 6 12 55 156 224 456 605 772 888 1230))
  ...

你还没理解楼主的题意!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-25 12:31 , Processed in 0.221299 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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