KF辉 发表于 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次~~~

wowan1314 发表于 2012-5-12 11:32:51

本帖最后由 wowan1314 于 2012-5-12 19:14 编辑

总结本帖。感谢caoyin指导。
;;求表中相同元素个数;;eg:(T11 1 '(1 1 1 2 2 3 4 4 4 4 5 6))-->3
;;方法1(caoyin推荐)
(defun T11 (IT LST / N)
(setq N 0)
(while (setq LST (member IT LST))
    (setq LST (cdr LST) N (1+ N))
)
)
;;方法2
(defun T12 (IT LST / N)
(setq N 0)
(while (vl-position IT LST)
    (setq LST (cdr LST) N (1+ N))
)
)
;;方法3
(defun T13 (IT LST)
(length (vl-remove-if-not '(lambda (X) (= X IT)) LST))
)
;;方法4
(DEFUN T14 (EXPR LST / N)
(SETQ N 0)
(foreach NAME LST (AND (= expr NAME) (SETQ N (1+ N))))
N
)









KF辉 发表于 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))))))


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

wowan1314 发表于 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

caoyin 发表于 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))
)

caoyin 发表于 2012-5-12 17:22:00

回wowan1314
member不必遍历每一个表元素,当然用vl-position也可以实现(函数本身真正的算法不知道)
foreach跟vl-remove-if-not差不多,遍历每一个元素

KF辉 发表于 2012-5-12 17:46:40

caoyin 发表于 2012-5-12 16:49 static/image/common/back.gif
(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 ?

梦醒才知原是梦 发表于 2012-5-14 08:53:04

页: [1]
查看完整版本: 虚心向各位请教一个问题