首页 > 解决方案 > Lisp递归函数检查列表中的值不起作用

问题描述

我正在研究一个递归函数,它接受一个列表和一个值 ex:'b'(a.b),如果没有找到则返回 nil,如果找到则返回 t。我的问题出在 (cond ((eq A (car L))) t) 行中,即使在 (cond ((and (and (atom L (eq AL))) t) 返回之后,它似乎也在检查该条件。我在印象是,如果满足该条件,则执行停止并且函数返回。有什么办法可以解决这个问题?另外,我只能使用原始函数 defun cond cons car cdr 运算符 +、-、< 和 > null eq listp atom symbolp

;test cases 
(checkInner 'b '(a . b))
(checkInner 'f '(c e f))
(checkInner 'b '(b))

;function 
(defun checkInner(A L)
    (cond ((and (atom L) (eq A L)) t)
    )
    (cond ((or (atom L) (eq A L)) nil)
    )
    (cond ((eq A (car L)) t)
            (t (checkInner A (cdr L))
            )
    )
)

标签: recursionlispprimitive

解决方案


除非您使用显式(return-from checkInner value)表达式,否则函数将返回其最后一个表达式的值。因此,您的函数返回的唯一值是最后一个cond表达式;前两个测试被忽略。

您需要将所有案例组合成一个COND表达式。

另外,第二个测试不应该使用or. ifL是一个原子,它不等于,L因为我们在前面的例子中测试过。

(defun checkInner(A L)
    (cond ((and (atom L) (eq A L)) t)
          ((atom L) nil)
          ((eq A (car L)) t)
          (t (checkInner A (cdr L)))))

推荐阅读