我正在尝试在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)))))
答案 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