gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:47:32 26 4
gpt4 key购买 nike

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

最佳答案

你几乎在那里,只是 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

关于lisp - 根据函数 F 返回列表 L 中的最佳元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19945193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com