对不起,如果我打开太多的Scheme问题,但这已经困扰了我一段时间了。
所以我有一个函数(比如配对记分器),它将一对字符串列表作为参数,并根据它们的接近程度对它们进行评分(相同字符为2分,不同字符为-1分)< / p>
所以例如
(pair-scorer '(("aaa" "bbb") ("ccc" "ccc") ("aaa" "aab")))
将返回'(-3 6 3)
我还有一个max函数,它将占用这个数字列表的最大值
例如
(max-list '(-3 6 3))
>6
现在问题出在这里。我需要创建一个过滤器来接受字符串对的列表,即。'(("aaa" "bbb") ("ccc" "ccc") ("aaa" "aab"))
,并且只返回在通过评分函数时产生最大值的一对(或多对)。
如何实施此过滤器? 希望我很清楚。
答案 0 :(得分:3)
我假设你有score
函数可以找到一对的得分(必须在pair-scorer
中调用)。试试这个:
(argmax score '(("aaa" "bbb") ("ccc" "ccc") ("aaa" "aab")))
这里的技巧是使用argmax
,它接收一个函数应用于列表中的每个元素,并找到该函数返回最大值的元素。
请注意argmax
将返回单个元素,即使有多个元素具有相同的最大值,如果这是一个问题,您必须编写自己的函数,但就现有程序而言,它很容易,并使用filter
:
(define (max-elements lst)
(let ((maximum (max-list (pair-scorer lst))))
(filter (lambda (pair) (= (score pair) maximum))
lst)))
以上将返回包含所有具有最高分数的元素的列表。如果只有一个,那么列表将包含一个元素。