如何编写一个兼容评分函数(我已经编写过)和一对字符串列表作为输入的函数(我对如何编写感到困惑),并返回修改后的字符串对列表,其中返回的列表应包含输入中的所有最佳字符串对,并根据输入函数进行评分。
示例输入:
'( ("hello" "b_low") ("hello_" "b_l_ow") ("hello" "_blow") ("hello" "blow") ("h_e_llo" "bl_o__w") )
示例输出:
( ("hello" "b_low") ("hello_" "b_l_ow") ("hello" "_blow") )
该函数采用如上所示的字符串对列表。它还具有功能。它使用此函数作为评估字符串对列表的手段。然后,它返回一个字符串对列表,其中包含所有具有最高匹配分数的字符串对,具体取决于给出的用于评估它们的函数。换句话说,(("你好"" b_low")("你好_"" b_l_ow")("你好" “_blow"))所有得分都是-3,但是(" h_e_llo"”bl_o__w“))得分为-12,因此从列表中删除。
计算alignemt的函数:
(define (char-scorer char1 char2)
(cond
((char=? char1 char2) 2)
((or (char=? char1 #\_ ) (char=? #\_ char2)) -2)
(else -1)))
(define (alignment-score s1 s2)
(define min-length (min (string-length s1) (string-length s2)))
(let loop ((score 0) (index 0))
(if (= index min-length)
score
(loop (+ score (char-scorer (string-ref s1 index) (string-ref s2 index)))(+ index 1)))))
答案 0 :(得分:0)
我会将操作分成两个步骤。
计算最高分数。这是一个可以做到这一点的功能。
(define (get-maximum-score lst scoring-func)
(apply max (map (lambda (x) (scoring-func (car x) (cadr x))) lst)))
通过选择与最高分数匹配的项目来过滤列表,然后删除其余项目。
(define (get-maximum-score-items lst scoring-func)
(define max-score (get-maximum-score lst scoring-func))
(define (helper in out)
(if (null? in)
out
(if (eq? max-score (scoring-func (caar in) (cadar in)))
(helper (cdr in) (append out (list (car in))))
(helper (cdr in) out))))
(helper lst '())
)
现在得到结果。
(print
(get-maximum-score-items
'(("hello" "b_low") ("hello_" "b_l_ow") ("hello" "_blow") ("hello" "blow") ("h_e_llo" "bl_o__w"))
alignment-score))