根据函数F返回列表L中的最佳元素?

时间:2013-11-13 04:16:56

标签: lisp common-lisp clisp

我正在尝试在lisp中编写一个函数,它有2个参数,一个函数F和一个列表L. 如果我放置'>代替F和列表L是'(1 2 3 4 5)它将返回5,因为5是最大的。 如果我们把'<然后它比较所有列表元素并将最小的元素作为输出。 等等。

我们甚至可以用自定义书写功能代替F进行比较。 我希望我能提供更多的示例代码,但我一开始就陷入困境。

(DEFUN givex (F L)
(cond
    (F (car L) (car (cdr L))
    ;after this i got stuck  
)
)

另一个尝试写这个功能

(defun best(F list)
    (if (null (rest list)) (first list)
    (funcall F (first List) (best (F list)))))

1 个答案:

答案 0 :(得分:3)

你几乎就在那里,只是else子句返回f的返回值而不是best元素:

(defun best (F list)
  (let ((first (first list))
        (rest (rest list)))
    (if (null rest)
        first
        (let ((best (best f rest)))
          (if (funcall F first best)
              best
              first)))))

示例:

(best #'< '(1 2 3))
==> 3
(best #'> '(1 2 3))
==> 1

请注意,此递归实现不是尾递归的,因此它不是最有效的实现。您可能更喜欢这样:

(defun best (f list) 
  (reduce (lambda (a b) (if (funcall f a b) b a)) list))

或者,更好的是,

(defmacro fmax (f)
  `(lambda (a b) (if (,f a b) b a)))

(reduce (fmax <) '(1 2 3))
==> 1
(reduce (fmax >) '(1 -2 3 -4) :key #'abs)
==> 1
(reduce (fmax <) '(1 -2 3 -4) :key #'abs)
==> 4