我正在研究一个递归函数,它接受一个列表和一个值ex:'b'(a.b),如果没有找到则返回nil,如果找到则返回t我的问题是在(cond((eq A(car L))t)行中,即使在(cond((and(atom L(eqa L))t)返回之后,它似乎也在检查这个条件我的印象是,如果满足该条件,则执行停止,函数返回有办法解决这个问题吗而且,im只能使用原始函数
解除
康德
欺骗
汽车
CDR
运算符+、-、
无效的
情商
列表
原子
符号

;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))
            )
    )
)

最佳答案

除非使用显式(return-from checkInner value)表达式,否则函数将返回其最后一个表达式的值因此,函数返回的唯一值是最后一个cond表达式;前两个测试将被忽略。
您需要将所有案例合并为一个COND表达式。
另外,第二个测试不应该使用or如果L是一个原子,它就不等于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)))))

07-26 01:45