Lisp递归函数来检查列表中的值不起作用

问题描述 投票:0回答:2

我正在使用一个递归函数,该函数需要一个列表和一个值ex:'b'(a。b),如果找不到则返回nil,如果找到则返回t。我的问题在(cond((eq A(car L))t)线中,即使(cond((and(atom L(eq L))t))返回之后,似乎仍在检查条件。印象是,如果满足该条件,则执行停止并返回该函数,是否可以解决此问题呢,而且,im只能使用原始函数防御条件缺点汽车博士运算符+,-,空值当量列表原子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))
            )
    )
)
recursion lisp primitive
2个回答
1
投票

除非使用显式的(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)))))

0
投票

所以我将其修复,感谢您确认Barmer,这是我的解决方法

(defun checkInner(A L)
    (cond ((and (atom L) (eq A L)) t)
        (t  (cond ((or (atom L) (eq A L)) nil)
                (t (cond ((eq A (car L)) t)
                        (t (checkInner A (cdr L))
                        )
                    )
                )
            )
        )
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.