【发布时间】:2016-12-18 17:37:55
【问题描述】:
我的任务是计算列表中所有重复的元素,例如
( 2 2 (3 3) 4 (3)) 将导致 2 (因为只有 2 和 3 有重复)
Searchdeep - 如果WHAT 不在列表WHERE 中,则返回零
Count2 - 遍历单个元素和子列表
如果找到原子,他将使用SEARCHDEEP 来确定它是否有重复,然后将检查列表OUT(以确保该原子是否尚未计算在内(例如,如 (3 3 3),其中应该返回 1,而不是 2)
,增加计数器并将原子添加到OUT 列表中。
但是,我不明白为什么,但它总是只返回1。我认为这是某种逻辑错误或函数使用错误。
我的代码是:
(SETQ OUT NIL)
(SETQ X (LIST 2 -3 (LIST 4 3 0 2) (LIST 4 -4) (LIST 2 (LIST 2 0 2))-5))
(SETQ count 0)
(DEFUN SEARCHDEEP (WHAT WHERE) (COND
((NULL WHERE) NIL)
(T (OR
(COND
((ATOM (CAR WHERE)) (EQUAL WHAT (CAR WHERE)))
(T (SEARCHDEEP WHAT (CAR WHERE)))
)
(SEARCHDEEP WHAT (CDR WHERE))
)
)
)
)
(DEFUN Count2 ( input)
(print input)
(COND
((NULL input) NIL)
(T
(or
(COND
((ATOM (CAR input))
(COND
(
(and ;if
(SEARCHDEEP (CAR INPUT) (CDR INPUT))
(NOT (SEARCHDEEP (CAR INPUT) OUT))
)
(and ;do
(Setq Count (+ count 1))
(SETQ OUT (append OUT (LIST (CAR INPUT))))
(Count2 (CDR input))
)
)
(t (Count2 (CDR input)))
)
)
(T (Count2 (CAR input)))
)
(Count2 (CDR input))
)
)
)
)
(Count2 x)
(print count)
【问题讨论】:
-
看起来你以前用不同的用户名问过类似的问题:stackoverflow.com/questions/39808344/… 和stackoverflow.com/questions/39811497/… 不幸的是你的编程风格没有改进,代码不可读。 :-(
标签: functional-programming common-lisp