LISP函数,给定数字和列表,返回大于n的第一个偶数

Sha*_*ers 1 lisp common-lisp

我找不到错误了.这一直在回归nil:

(even-greater-n 5 '(1 2 3 4 5 6 7))

(defun even-greater-n (n L)
   (cond ((null L) nil)
         ((and (> (car L) n) (evenp n)) (car L))
         (t (even-greater-n n (cdr L)))))
Run Code Online (Sandbox Code Playgroud)

sds*_*sds 5

你的错误

你要去 而不是.evenp n(car L)

迭代

使用loop以下方法相对容易实现 :

(defun even-greater (n l)
  (loop for k in l
    when (and (< n k)
              (evenp k))
    return k))

(even-greater 5 '(1 2 3 4 5 6 7 8))
==> 6
Run Code Online (Sandbox Code Playgroud)

递归

如果您需要使用递归,您也可以这样做:

(defun even-greater (n l)
  (cond ((endp l) nil)
        ((and (< n (first l))
              (evenp (first l)))
         (first l))
        (t (even-greater n (rest l)))))

(even-greater 3 '(1 2 3 4 5 6 7 8))
==> 4
Run Code Online (Sandbox Code Playgroud)

图书馆

当然,Lisp有一个非常强大的库,包括 find-if:

(defun even-greater (n l)
  (find-if (lambda (k)
             (and (< n k)
                  (evenp k)))
           l))

(even-greater 2 '(1 2 3 4 5 6 7 8))
==> 4
Run Code Online (Sandbox Code Playgroud)