2

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

1 回答 1

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
于 2013-11-13T05:31:50.483 回答