明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1497|回复: 7

虚心向各位请教一个问题

[复制链接]
发表于 2012-5-12 10:59:20 | 显示全部楼层 |阅读模式
本帖最后由 KF辉 于 2012-5-12 13:10 编辑

虚心向各位请教一个问题,小弟刚学lisp,有很多东西不懂,下面这个问题困扰了我很久了,请各位指点指点

想让帮忙写一个函数lst(a,b),能计算出元素a在b表中的个数"

例如有个表lst(1 1 1 2 2 3)

能统计出1出现了3次,2出现2次~~~

发表于 2012-5-12 11:32:51 | 显示全部楼层
本帖最后由 wowan1314 于 2012-5-12 19:14 编辑

总结本帖。感谢caoyin指导。
  1. ;;求表中相同元素个数;;eg:(T11 1 '(1 1 1 2 2 3 4 4 4 4 5 6))-->3  
  2. ;;方法1(caoyin推荐)
  3. (defun T11 (IT LST / N)
  4.   (setq N 0)
  5.   (while (setq LST (member IT LST))
  6.     (setq LST (cdr LST) N (1+ N))
  7.   )
  8. )
  9. ;;方法2
  10. (defun T12 (IT LST / N)
  11.   (setq N 0)
  12.   (while (vl-position IT LST)
  13.     (setq LST (cdr LST) N (1+ N))
  14.   )
  15. )
  16. ;;方法3
  17. (defun T13 (IT LST)
  18.   (length (vl-remove-if-not '(lambda (X) (= X IT)) LST))
  19. )
  20. ;;方法4
  21. (DEFUN T14 (EXPR LST / N)
  22.   (SETQ N 0)
  23.   (foreach NAME LST (AND (= expr NAME) (SETQ N (1+ N))))
  24. N
  25. )










本帖子中包含更多资源

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

x

评分

参与人数 1金钱 +5 收起 理由
KF辉 + 5 赞一个!

查看全部评分

 楼主| 发表于 2012-5-12 13:34:06 | 显示全部楼层
(defun n(x)
  (setq y '(1 1 1 2 2 3 4 4 4 4 5 6))
  (if (member x y)
      (do ((a 0 (1+ a)))
           ((null y) a)
        (do ()
            ((= x (nth 0 y)) y)
          (setq y (cdr y))))))


上面是一个死循环,请问这种方法思路错在哪里?

点评

你写的没看懂!:(  发表于 2012-5-12 14:58
发表于 2012-5-12 14:55:35 | 显示全部楼层
命令: (T11 2 '(1 1 1 2 2 3 4 4 4 4 5 6))
2

命令: (T11 3 '(1 1 1 2 2 3 4 4 4 4 5 6))
1

命令: (T11 4 '(1 1 1 2 2 3 4 4 4 4 5 6))
4

命令: (T11 5 '(1 1 1 2 2 3 4 4 4 4 5 6))
1

命令: (T11 1 '(1 1 1 2 2 3 4 4 4 4 5 6))
3
发表于 2012-5-12 16:49:57 | 显示全部楼层
(defun TT1 (IT LST);;推荐
  (setq N 0)
  (while (setq LST (member IT LST))
    (setq LST (cdr LST) N (1+ N))
  )
)

(defun TT2 (IT LST)
  (length (vl-remove-if-not '(lambda (X) (= X IT)) LST))
)

点评

高,一下写出两个,请问member方法与foreach方法哪个好?还有vl-remove-if-not方法为何不好(更短啊)  发表于 2012-5-12 17:05
发表于 2012-5-12 17:22:00 | 显示全部楼层
回wowan1314  
member不必遍历每一个表元素,当然用vl-position也可以实现(函数本身真正的算法不知道)
foreach跟vl-remove-if-not差不多,遍历每一个元素

点评

本以为越短越好呢,看来算法才是关键呀。谢谢指导。  发表于 2012-5-12 17:45

评分

参与人数 1明经币 +1 收起 理由
wowan1314 + 1 很给力!

查看全部评分

 楼主| 发表于 2012-5-12 17:46:40 | 显示全部楼层
caoyin 发表于 2012-5-12 16:49
(defun TT1 (IT LST);;推荐
  (setq N 0)
  (while (setq LST (member IT LST))

(n 1 '(1 1 1 2 2 3 4 4 4 4 5 6)) 用你第一种方法我怎么测试都是输出nil ?

点评

(TT1 1 ......  发表于 2012-5-12 18:32
发表于 2012-5-14 08:53:04 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-7-22 05:42 , Processed in 0.182379 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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