ysq101 发表于 2016-3-11 16:26:56

问个小白问题 表内元素交集


表1为:   (1 2 3 4 5 )
表2为:   ( 2 3 4 5 6)
表3为:   ( 3 4 5 6 7)
表4为:   (4 5 6 7 8)

要求返回所有表都有的元素    (4 5)

这程序应该怎么写
LISP放下一年   忘得差不多了
谢谢大师们提点一下

Gu_xl 发表于 2016-3-11 16:37:30

(defun f (l / a l1)
(setq        l1 (car l)
        l(cdr l)
)
(while l
    (setq a (car l)
          l (cdr l)
          c nil
    )
    (foreach b l1
      (if (member b a)
        (setq c (cons b c))
      )
    )
    (setq l1 c)
)
(reverse l1)
)

_$ (f '((1 2 3 4 5)(2 3 4 5 6)(3 4 5 6 7)(4 5 6 7 8)))
(4 5)
_$

ysq101 发表于 2016-3-11 19:40:06

Gu_xl 发表于 2016-3-11 16:37 static/image/common/back.gif
(defun f (l / a l1)
(setq        l1 (car l)
        l(cdr l)


谢谢固版主。。。都帮我写好了。。
谢谢了。。

Andyhon 发表于 2016-3-11 22:59:00

另方: 串成一列 个数小于4的剔除

xyp1964 发表于 2016-3-12 13:04:01

(setq lst '((1 2 3 4 5)
            (2 3 4 5 6)
            (3 4 5 6 7)
            (4 5 6 7 8)
         )
)
;; (aaa lst)
(defun aaa (lst / l1)
(setq l1 (car lst))
(foreach a lst (setq l1 (vl-remove-if-not '(lambda (x) (member x a)) l1)))
)

ysq101 发表于 2016-3-12 14:37:24

xyp1964 发表于 2016-3-12 13:04 static/image/common/back.gif


谢谢帮助~~~~~~~~~~~支持大师

ysq101 发表于 2016-3-12 14:38:29

Andyhon 发表于 2016-3-11 22:59 static/image/common/back.gif
另方: 串成一列 个数小于4的剔除

好办法。。但表内可能出现4个元素与12个元素

Andyhon 发表于 2016-3-12 16:43:50

4 化成变量即得
但得关心下效率的问题

llsheng_73 发表于 2016-3-17 09:46:34

本帖最后由 llsheng_73 于 2016-3-17 10:05 编辑

(defun f(l / a)
(setq a(car l))
(foreach x(cdr l)(setq a(vl-remove-if-not'(lambda(y)(member y x))a))))
写完了才发现跟院长的一样

highflybird 发表于 2016-3-17 15:39:26

本帖最后由 highflybird 于 2016-3-17 15:40 编辑

(defun Intersect (lst / x l)
(setq l (car lst))
(foreach p (cdr lst)
    (setq x nil)
    (foreach n p
      (if (member n l)
      (setq x (cons n x))
      )
    )
    (setq l x)
)
x
)
这样可能效率高些。
页: [1] 2
查看完整版本: 问个小白问题 表内元素交集