找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1776|回复: 16

[建议]:大家一起来写,得到表中的元素.

[复制链接]

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-2-24 23:34:54 | 显示全部楼层 |阅读模式

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

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

×
(defun nth-n(lst from to)
要求:
lst  --> (0 1 2 3 4 5 6 7 8 9 )
从表lst中取from到to的元素组成新表.
-->(nth lst 2 4) --> '(2 3 4)

from可以比to大-->(nth-n lst 4 2) --> '(4 3 2)

form和to超过了lst的长度,那就取到表尾.小于0,取到第一个.
  --> (nth-n lst 8 12) --> '(8 9)  -->(nth lst 2 -3)--> '(2 1 0)

还有什么想到再加.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-2-25 00:25:24 | 显示全部楼层
如果form是无效值,就从表头到to
如果to是无效值,就从form到表尾
如果都是无效值就取原表。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2004-2-25 00:28:38 | 显示全部楼层
最初由 zhynt 发布
[B]如果form是无效值,就从表头到to
如果to是无效值,就从form到表尾。 [/B]


我以为你写了呢:)

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

使用道具 举报

发表于 2004-2-25 01:56:18 | 显示全部楼层
版主一定有好的构思了,不如先贴一个出来吧:)
不过看上去也不算难;P
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-25 02:34:45 | 显示全部楼层
先来个简单的:

  1. (defun from-to (lst from to)
  2.   (setq lst1 '())
  3.   (setq        form (1- from)
  4.         to   (1- to)
  5.   )  
  6.   (if (< from to)
  7.     (progn
  8.       (while (<= from to)
  9.         (setq lst1 (cons (nth from lst) lst1))
  10.         (setq form (1+ from))
  11.       )
  12.       (reverse lst1)
  13.     )
  14.     (progn
  15.       (while (<= to from)
  16.         (setq lst1 (cons (nth to lst) lst1))
  17.         (setq to (1+ to))
  18.       )
  19.       lst1
  20.     )
  21.   )
  22. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-25 02:42:57 | 显示全部楼层
测试楼上的,好像还得加把劲哦:)
(setq lst '(0 1 2 3 4 5 6 7 8 9))
(form-to lst 2 4)->(1 2 3)
(form-to lst 2 22)->(1 2 3 4 5 6 7 8 9 nil nil nil nil nil nil nil nil nil nil nil nil)
(form-to lst -2 4) ->错误: 参数值错误: 非负: -3
(form-to lst nil nil)->错误: 参数类型错误: numberp: nil
(form-to lst 4 nil)->错误: 参数类型错误: numberp: nil
(form-to lst 2 -5)->错误: 参数值错误: 非负: -6
(form-to lst 12 -4)->错误: 参数值错误: 非负: -5


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

使用道具 举报

发表于 2004-2-25 09:03:06 | 显示全部楼层
测测这个:
[PHP]

(defun tt(one_lst fm to / nw_lst delta n dirction)
(if fm ()(setq fm 0))
(if to ()(setq to (length one_lst)))
(setq n (abs (- to fm)) dirction (if (>= TO FM) 1 -1))
(repeat (1+ n)
(if (and (>= fm 0) (setq tmp (nth fm one_lst)))
(setq nw_lst (append nw_lst (list tmp)))
)
(setq fm (+ fm dirction))
)
(print nw_lst)
)

(setq lst '(0 1 2 3 4 5 6 7 8 9 ))
(tt lst 120 -120 )
(tt lst nil nil)
(tt lst -120 -120)
(tt lst 2 6)
(tt lst 2 -3)
[/PHP]

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

使用道具 举报

发表于 2004-2-25 12:14:15 | 显示全部楼层
wkai ,再改改
TT
_$

错误: 参数类型错误: consp nil


昨晚做了一个:
[php]
;|(xl-sub lst from to) = 从表中取部分元素组表(扩展) v1.0-------------------------陌生人.2004.2
功能: 1.从表中取from 到 to 的元素组成新表.(序号从0起算)
      2.from>to时新表倒置.支持from,to为nil(默认取头尾序号)或超出表序号范围,返回有效序号的元素组成的新表.
测试:
(setq lst '(0 1 2 3 4 5 6 7 8 9 ))
(xl-sub lst 2 4) -> (2 3 4)
(xl-sub lst nil nil) -> (0 1 2 3 4 5 6 7 8 9)
(xl-sub lst -2 5) -> (0 1 2 3 4 5)
(xl-sub lst 5 12) -> (5 6 7 8 9)
(xl-sub lst -22 22) -> (0 1 2 3 4 5 6 7 8 9)
(xl-sub lst 6 2) -> (6 5 4 3 2)
(xl-sub lst 6 -10) -> (6 5 4 3 2 1 0)
(xl-sub lst 5.5 8.1) -> (6 7 8)
|;
[/php]
想先看看aeo版主的高招再贴。:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-25 12:39:36 | 显示全部楼层
我的

  1. (defun nth-n (lst from to / lsth i kls lsmax lsmin)
  2. (setq lsth (1+(length lst)) i 0)
  3. (setq lsmin(min from to))(setq lsmax(max from to))
  4.   (cond
  5.     ((> lsmax lsth)(setq lsmax (- lsth 2)))
  6.     ((< lsmin 0)(setq lsmin 0))
  7.     )
  8.   (repeat lsth
  9.        (if (and(<= i lsmax)(>= i lsmin))
  10.          (setq kls (cons (nth i lst) kls))
  11.          )
  12.        (setq i (+ i 1))
  13.        )      
  14.     (reverse kls)
  15.        )

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

使用道具 举报

发表于 2004-2-25 13:47:49 | 显示全部楼层
to  snsj :
(nth-n a 30 2)------------->(3 6 9 8 5 7 9 7 3 5 9)
(nth-n a 2 32)------------->(3 6 9 8 5 7 9 7 3 5 9)
(nth-n a -2 30)------------->(3 6 9 8 5 7 9 7 3 5 9)

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

使用道具 举报

发表于 2004-2-25 14:03:20 | 显示全部楼层
差不多了。差不多了。
snsj的还差 from,to为nil时候的处理。还有当from>to时候结果需reverse
wkai的序号有一位需要处理:
(setq lst '(0 1 2 3 4 5 6 7 8 9 ))
(tt lst 2 4) -> (2 3)差4
(tt lst nil nil) -> (0 1 2 3 4 5 6 7 8 9) ok
(tt lst -2 5) -> (0 1 2 3 4) 差5。
(tt lst 5 12) -> (5 6 7 8 9) ok
(tt lst -22 22) -> (0 1 2 3 4 5 6 7 8 9)ok
(tt lst 6 2) -> (6 5 4 3) 差2
(tt lst 6 -10) -> (6 5 4 3 2 1 0) ok
(tt lst 5.5 8.1) -> 错误: 参数类型错误: fixnump: 2.6
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-25 14:10:02 | 显示全部楼层
最初由 陌生人 发布
(tt lst 5.5 8.1) -> 错误: 参数类型错误: fixnump: 2.6


呵呵,请教 陌生人 是否还要考虑以下的情况

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

使用道具 举报

发表于 2004-2-25 14:37:10 | 显示全部楼层
我认为没有必要搞得这么复杂,所有不符条件的参数都应提示出错最多返回“空表”,因为不符条件的情况太多了,不可能都满足的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-25 14:52:50 | 显示全部楼层

  1. (defun nth-n (lst from to / lsth i kls lsmax lsmin)
  2. (setq lsth (1+(length lst)) i 0)
  3.   (cond
  4.     ((and(null from)(/= to nil))(setq from 0))
  5.     ((and(null to)(/= from nil))(setq to 0))
  6.     ((and(null from)(null to)) (setq from 0)(setq to (- lsth 2)))
  7.     )
  8. (setq lsmin(min from to))(setq lsmax(max from to))
  9.   (cond
  10.     ((> lsmax lsth)(setq lsmax (- lsth 2)))
  11.     ((< lsmin 0)(setq lsmin 0))   
  12.     )
  13.   (repeat lsth
  14.        (if (and(<= i lsmax)(>= i lsmin))
  15.          (setq kls (cons (nth i lst) kls))
  16.          )
  17.        (setq i (+ i 1))
  18.        )
  19.    (cond     
  20.      ((> from to) kls)
  21.      (t (reverse kls))
  22.      )  
  23.        )

改正FROM大于TO反转表,FROM和TO同时为NIL时候返回全表,FROM为NIL且TO不为NIL时设置FROM从0开始计数,当TO为NIL且FROM不为NIL的时候,设置TO为0
增加:
(nth-n 'a nil 8)------>(0 1 3 6 9 8 5 7 9)
(nth-n 'a 8 nil)------>(9 7 5 8 9 6 3 1 0)
(nth-n 'a nil nil)------>(0 1 3 6 9 8 5 7 9 7 3 5 9)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-25 17:43:38 | 显示全部楼层
最初由 wkai 发布
[B]

呵呵,请教 陌生人 是否还要考虑以下的情况

[PHP]
(tt lst "3.1415926"  '(2))
(tt lst '(3  6))
...... [/B]

对不起,不是有意搞复杂的。
因为snsj的程序支持这个。因此顺便也拿你的来测一下。最后 的那个测试无关紧要。不支持也不要紧。呵呵。


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-3 10:03 , Processed in 0.199059 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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