找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 6692|回复: 50

[] 返回表第N个元素之后的所有元素(不包括N)

[复制链接]

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-12 22:20:12 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::List:N+
调用格式: (XD::List:N+ lst n)
参数说明: LST ---- 表
N ---- 序号(从1开始)
返回值:
函数简介: 返回表第N个元素之后的所有元素(不包括N)
函数来源: 原创
函数作者: Lispboy
适用版本: 不限 
最后更新时间: 2013-06-12
备注: 命令: !B
(2334 556 33 44 66 77 22)

命令: (XD::List:N+ b 3)
(44 66 77 22)
演示图片: -

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

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

×
本帖最后由 Lispboy 于 2013-6-13 00:41 编辑

  1. ;|

  2.    返回表第N个元素之后的所有元素(不包括N)

  3.    参数:
  4.        LST ---- 表
  5.        N   ---- 序号(从1开始)
  6. |;
  7. (defun XD::List:N+ (lst n / lst1 i l)
  8.   (setq l (length lst))
  9.   (cond
  10.     ((< n 1)
  11.       lst
  12.     )
  13.     ((= n 1)
  14.       (cdr lst)
  15.     )
  16.     ((= n 2)
  17.       (cddr lst)
  18.     )
  19.     ((= n 3)
  20.       (cdddr lst)
  21.     )
  22.     ((= n 4)
  23.       (cddddr lst)
  24.     )
  25.     ((and
  26.        (>= n 5)
  27.        (<= l)
  28.      )
  29.       (if (< n 1)
  30.         (setq n 1)
  31.       )
  32.       (setq i 0)
  33.       (if (< n (/ l 2.0))
  34.         (progn
  35.           (while (and
  36.                    (setq a (car lst))
  37.                    (< i n)
  38.                  )
  39.             (setq lst (cdr lst)
  40.                   i (1+ i)
  41.             )
  42.           )
  43.           lst
  44.         )
  45.         (progn
  46.           (setq lst (reverse lst))
  47.           (while (and
  48.                    (setq a (car lst))
  49.                    (< i (- l n))
  50.                  )
  51.             (setq lst1 (cons a lst1)
  52.                   lst (cdr lst)
  53.                   i (1+ i)
  54.             )
  55.           )
  56.           lst1
  57.         )
  58.       )
  59.     )
  60.   )
  61. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-6-12 22:25:24 | 显示全部楼层
整复杂了吧
[pcode=lisp,true]
(defun XD::List:N (lst n)
  (repeat n
    (setq lst (cdr lst))
  )
)[/pcode]

点评

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

使用道具 举报

发表于 2013-6-12 22:34:15 | 显示全部楼层
Free-Lancer 发表于 2013-6-12 22:25
整复杂了吧

(defun XD:ist:N (lst n)

确实整复杂了!代码前面加个if判断吧!
  1. (defun XD::List:N (lst n)
  2.   (if (< n (length lst)
  3.    (repeat n
  4.     (setq lst (cdr lst))
  5.   )
  6. )
  7. )

点评

谁都没注意楼主的意思,大于表长的1/2 位置,从表后面循环,小于表1/2的时候,从表前循环。  详情 回复 发表于 2013-6-12 23:02
个人认为没必要,Alisp 这个应用多数情况不会用到溢出情况,真要有这种特殊情况的时候另写加判断的  详情 回复 发表于 2013-6-12 22:41
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-12 22:41:18 | 显示全部楼层
Love-Lisp 发表于 2013-6-12 22:34
确实整复杂了!代码前面加个if判断吧!

个人认为没必要,Alisp 这个应用多数情况不会用到溢出情况,真要有这种特殊情况的时候另写加判断的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-12 22:45:21 | 显示全部楼层
本帖最后由 wowan1314 于 2013-6-13 09:30 编辑

支持! 条条马路通罗马。  楼主这是在改造原有函数吗?
  1. ;;=============={ 用member的话,对于有重复元素的表是不行的 }===================
  2. ;;测试: (T3 3 '(2334 556 33 44 66 77 22))==> (44 66 77 22)
  3. (DEFUN T3 (n lst)
  4. (setq n (nth n lst))
  5. (member n lst)
  6. )
  7. ;;=============={ 返回表第N个元素之后的所有元素 }===================
  8. ;;测试: (T31 3  '(2334 556 33 44 66 77 22))==> (44 66 77 22)
  9. (DEFUN T31 (n LST / A)
  10. (setq A 0)
  11. (vl-member-if '(lambda(x)(setq A (1+ A)) (< n A) ) lst)
  12. )
  13. ;;=============={ 返回表第N个元素之后的所有元素 }===================
  14. ;;测试: (T32 3  '(2334 556 33 44 66 77 22))==> (44 66 77 22)
  15. (DEFUN T32 (n LST / A)
  16. (setq A 0)
  17. (vl-remove-if '(lambda(x)(setq A (1+ A)) (<= A n) ) lst)
  18. )

点评

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

使用道具 举报

发表于 2013-6-12 22:53:57 | 显示全部楼层
那么多意义不大的函数记得住吗?

点评

你可以不用,这些是表的基本操作函数,用它组合完成其他函数。  详情 回复 发表于 2013-6-12 23:15
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-12 22:56:19 | 显示全部楼层
wowan1314 发表于 2013-6-12 22:45
支持! 条条马路通罗马。  楼主这是在改造原有函数吗?

如果Nth前有重复元素,Member就不对了,论坛老帖子有过讨论

点评

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

使用道具 举报

发表于 2013-6-12 22:57:37 | 显示全部楼层
Free-Lancer 发表于 2013-6-12 22:56
如果Nth前有重复元素,Member就不对了,论坛老帖子有过讨论

有道理! 没考虑那么多! 呵呵! 受教了。

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-6-12 23:01:31 | 显示全部楼层
wowan1314 发表于 2013-6-12 22:57
有道理! 没考虑那么多! 呵呵! 受教了。

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-6-12 23:02:55 | 显示全部楼层
Love-Lisp 发表于 2013-6-12 22:34
确实整复杂了!代码前面加个if判断吧!

谁都没注意楼主的意思,大于表长的1/2 位置,从表后面循环,小于表1/2的时候,从表前循环。

点评

经测试,分治算法确实可以提高效率,不过差在毫秒级  详情 回复 发表于 2013-6-12 23:33
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-12 23:15:19 | 显示全部楼层
本帖最后由 Lispboy 于 2013-6-13 00:51 编辑
Gdlprfcu 发表于 2013-6-12 22:53
那么多意义不大的函数记得住吗?

你可以不用,这些是表的基本操作函数,用它组合完成其他功能更强的函数。

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

使用道具 举报

发表于 2013-6-12 23:33:36 | 显示全部楼层
newer 发表于 2013-6-12 23:02
谁都没注意楼主的意思,大于表长的1/2 位置,从表后面循环,小于表1/2的时候,从表前循环。

经测试,分治算法确实可以提高效率,不过差在毫秒级

点评

不知道用满足条件就退出循环的mapcar方法比楼主的函数会不会更优秀?!  详情 回复 发表于 2013-6-13 09:49
程序代码就是写一次,所以不要拿多少时间来衡量一个程序。有好的算法一定要用。写程序就是画画,要精益求精, 这是一个习惯问题。  详情 回复 发表于 2013-6-13 00:40
几百毫秒时间就会感觉到卡顿了。一百毫秒以下才可忽略差别。  详情 回复 发表于 2013-6-12 23:43
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-12 23:43:02 | 显示全部楼层
Free-Lancer 发表于 2013-6-12 23:33
经测试,分治算法确实可以提高效率,不过差在毫秒级

几百毫秒时间就会感觉到卡顿了。一百毫秒以下才可忽略差别。

点评

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-13 00:40:35 | 显示全部楼层
本帖最后由 Lispboy 于 2013-6-13 02:45 编辑
Free-Lancer 发表于 2013-6-12 23:33
经测试,分治算法确实可以提高效率,不过差在毫秒级

程序代码就是写一次,所以不要拿提高的时间不多来衡量一个程序。有好的算法一定要用。写程序就是画画,要精益求精:lol, 这是一个习惯问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-13 00:42:31 | 显示全部楼层
本帖最后由 Lispboy 于 2013-6-13 00:50 编辑
wowan1314 发表于 2013-6-12 23:43
几百毫秒时间就会感觉到卡顿了。一百毫秒以下才可忽略差别。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-16 20:19 , Processed in 0.388803 second(s), 74 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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