Написание функции схемы

Как написать функцию, которая принимает как функцию оценки (которую я уже написал), так и список пар строк в качестве входных данных (что я запутался в том, как писать), и возвращает измененный список пар строк где возвращаемый список должен содержать все оптимальные пары строк из входных данных, рассчитанные в соответствии с функцией ввода.

Пример ввода:

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

функция принимает список пар строк, как показано выше. Это также принимает функцию. Он использует эту функцию, которая используется для оценки списка пар строк. Затем он возвращает список пар строк, содержащих все пары строк, которые имели наивысший рейтинг совпадений, основываясь на функции, с которой он был назначен для их оценки. Другими словами, (("hello", "b_low") ("hello_", "b_l_ow") ("hello", "_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 ответ

Я бы разделил операцию на два этапа.

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

Теперь получите результат.

(print
 (get-maximum-score-items
  '(("hello" "b_low") ("hello_" "b_l_ow") ("hello" "_blow") ("hello" "blow") ("h_e_llo" "bl_o__w"))
     alignment-score))
Другие вопросы по тегам