Lisp рекурсивная функция для проверки значения в списке не работает - PullRequest
0 голосов
/ 29 октября 2019

Я работаю над рекурсивной функцией, которая принимает список и значение ex: 'b' (a. B) и возвращает nil, если не найдено, и t, если найдено. моя проблема в строке (cond ((eq A (car L)) t), кажется, что проверка этого условия даже после того, как (cond ((и (atom L (eq AL)) t) возвращается). Я подСоздается впечатление, что если это условие выполнено, выполнение прекращается и функция возвращается. Любой способ это исправить? Кроме того, я могу использовать только примитивные функции defun cond cons операторы 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))
            )
    )
)

Ответы [ 2 ]

3 голосов
/ 29 октября 2019

Если вы не используете явное выражение (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 голосов
/ 29 октября 2019

так что я исправил это, спасибо за подтверждение, Бармер, это мое решение

(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))
                        )
                    )
                )
            )
        )
    )
)
...