找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1181|回复: 9

[每日一码] 根据表第一项特征分组

[复制链接]
发表于 2013-6-1 16:00:03 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 snsj 于 2013-6-1 16:03 编辑

(setq lst '(2 1 3 4 5 6 2 7 8 9 2 11 13 14 2))----->'((2 1 3 4 5 6) (2 7 8 9) (2 11 13 14) (2))
最近迷恋上了双while循环,欢迎高手参与,做出最高效代码和最短代码
  1. ;;;特征表项分组,根据表第一项特征将表分组
  2. ;;;lst:一个表,如果不是表返回nil
  3. (defun cathh-lst-tzfz (lst / a kj kjj i)
  4. (if(listp lst);如果不是表返回nil
  5. (progn
  6. (setq a(car lst) kj nil kjj nil i 0)
  7. (while (/= lst nil)
  8.   (while (and(/= lst nil)(or(null(equal(car lst)a))(zerop i)))   
  9.     (setq kj(cons(car lst)kj))
  10.     (setq lst(cdr lst))
  11.     (setq i(1+ i))
  12.     )(setq kjj (cons(reverse kj)kjj)kj nil i 0)
  13.   )(setq kjj(reverse kjj))
  14.   )(setq kjj nil);progn  
  15.   )kjj;if end
  16.   )

评分

参与人数 1D豆 +5 收起 理由
牢固 + 5 出题引导交流奖!

查看全部评分

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

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-6-1 16:32:04 | 显示全部楼层
本帖最后由 牢固 于 2013-6-1 17:20 编辑

  1. (defun f (l a / b c)
  2.   (while l
  3.     (if        (= a (car l))
  4.       (progn (if b
  5.                (setq c (cons (reverse b) c)
  6.                      b nil
  7.                )
  8.              )
  9.              (setq b (cons (car l) b)
  10.                    l (cdr l)
  11.              )
  12.              (while (and l (/= a (car l)))
  13.                (setq b (cons (car l) b)
  14.                      l (cdr l)
  15.                )
  16.              )
  17.              (setq c (cons (reverse b) c)
  18.                    b nil
  19.              )
  20.       )
  21.       (progn (setq b (cons (car l) b)
  22.                    l (cdr l)
  23.              )
  24.       )
  25.     )
  26.   )
  27.   (if b
  28.     (setq c (cons (reverse b) c)
  29.           b nil
  30.     )
  31.   )
  32.   (reverse c)
  33. );;测试 (f '(2 1 3 4 5 6 2 7 8 9 2 11 13 14 2)  2) ==>'((2 1 3 4 5 6) (2 7 8 9) (2 11 13 14) (2))  


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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-1 17:08:28 | 显示全部楼层
为什么喜欢双WHILE循环了,用MAPCAR不能解决吗?

点评

WHILE能碰到设定条件后就会退出,而MAPCAR要对整个表循环一遍  详情 回复 发表于 2013-6-1 17:28
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-1 17:09:40 | 显示全部楼层
楼主,这表的第一特征是什么? 没太看出来。4个小表是根据什么定的?
哦,看明白了,见到2就开新表吗?

点评

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

使用道具 举报

 楼主| 发表于 2013-6-1 17:25:37 | 显示全部楼层
Lispboy 发表于 2013-6-1 17:09
楼主,这表的第一特征是什么? 没太看出来。4个小表是根据什么定的?
哦,看明白了,见到2就开新表吗?

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

使用道具 举报

 楼主| 发表于 2013-6-1 17:28:35 | 显示全部楼层
Lispboy 发表于 2013-6-1 17:08
为什么喜欢双WHILE循环了,用MAPCAR不能解决吗?

WHILE能碰到设定条件后就会退出,而MAPCAR要对整个表循环一遍

点评

你不是要效率吗,如果表数据很大的情况下,即使MAPCAR全循环一遍也比双WHILE要快的多的多。 另外,你说的遇到限制退出,是什么限制? 看你的题目好像没说限制。  详情 回复 发表于 2013-6-1 17:56
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-1 17:56:53 | 显示全部楼层
snsj 发表于 2013-6-1 17:28
WHILE能碰到设定条件后就会退出,而MAPCAR要对整个表循环一遍

你不是要效率吗,如果表数据很大的情况下,即使MAPCAR全循环一遍也比双WHILE要快的多的多。

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

使用道具 举报

发表于 2013-6-1 18:45:00 | 显示全部楼层
本帖最后由 Love-Lisp 于 2013-6-1 18:49 编辑

递归法:
  1. (defun f (l)  (defun f1 (l a b)
  2.     (if l
  3.       (cond
  4.         ((= (car l) a)
  5.          (cons b (f1 (cdr l) a (list a)))
  6.          )
  7.         (t (f1 (cdr l) a (append b (list (car l)))))
  8.         )
  9.       (if b
  10.         (list b)
  11.         )
  12.       )
  13.     )
  14.   (f1 (cdr l) (car l) (list (car l)))
  15.   )

评分

参与人数 1D豆 +5 收起 理由
牢固 + 5 技术引导讨论和指点奖!

查看全部评分

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

使用道具 举报

发表于 2013-6-1 19:04:06 来自手机 | 显示全部楼层
为什么不用member判断呢?来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1094个

财富等级: 财源广进

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 03:37 , Processed in 0.256340 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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