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

时间:2017-10-29 23:13:13

标签: 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)))))

3 个答案:

答案 0 :(得分: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

递归

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

(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

当然,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

答案 1 :(得分:1)

您必须查找class LoginPage(tk.Frame): def __init__(self,parent,controller): self.controller = controller ... 是否均等。

答案 2 :(得分:0)

使用find-if和单个开放编码的lambda函数:

(defun even-greater (n list)
  (find-if (lambda (item) (and (> item n) (evenp item))) list)) 

使用功能组合器:

;; Combine multiple functions with AND:
;; Returns a function of one-argument which
;; passes that argument to the functions in the list,
;; one by one. If any function returns nil, it stops
;; and returns nil. Otherwise it returns the value
;; returned by the last function:
(defun andf (&rest functions)                                               
  (lambda (arg)
    (let (res)
      (dolist (f functions res)
        (unless (setf res (funcall f arg))
          (return))))))

 ;; Returns a one-argument function which tests
 ;; whether its argument is greater than quant.
 (defun greater (quant)
   (lambda (arg) (> arg quant)))

 ;; "find it, if it is greater than n, and even"
 (defun even-greater (n list)                                                
   (find-if (andf (greater n) #'evenp) list))