编写方案函数

时间:2014-04-21 19:40:50

标签: functional-programming scheme gambit

如何编写一个兼容评分函数(我已经编写过)和一对字符串列表作为输入的函数(我对如何编写感到困惑),并返回修改后的字符串对列表,其中返回的列表应包含输入中的所有最佳字符串对,并根据输入函数进行评分。

示例输入:

'( ("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))))) 

1 个答案:

答案 0 :(得分:0)

我会将操作分成两个步骤。

  1. 计算最高分数。这是一个可以做到这一点的功能。

    (define (get-maximum-score lst scoring-func)
     (apply max (map (lambda (x) (scoring-func (car x) (cadr x))) lst)))
    
  2. 通过选择与最高分数匹配的项目来过滤列表,然后删除其余项目。

    (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 '())
      )
    
  3. 现在得到结果。

    (print
     (get-maximum-score-items
      '(("hello" "b_low") ("hello_" "b_l_ow") ("hello" "_blow") ("hello" "blow") ("h_e_llo" "bl_o__w"))
         alignment-score))