虚心向各位请教一个问题
本帖最后由 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 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
)
(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))))))
上面是一个死循环,请问这种方法思路错在哪里? 命令: (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 (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))
) 回wowan1314
member不必遍历每一个表元素,当然用vl-position也可以实现(函数本身真正的算法不知道)
foreach跟vl-remove-if-not差不多,遍历每一个元素 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 ?
页:
[1]