具有函数作为谓词的Scheme过滤器

时间:2014-04-21 19:11:00

标签: scheme racket

对不起,如果我打开太多的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")),并且只返回在通过评分函数时产生最大值的一对(或多对)。

如何实施此过滤器? 希望我很清楚。

1 个答案:

答案 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)))

以上将返回包含所有具有最高分数的元素的列表。如果只有一个,那么列表将包含一个元素。