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

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

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

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

person Definer    schedule 21.04.2014    source источник
comment
Это кажется очень связанным (возможный дубликат) Схема - Помощь в написании функции. Примеры входных и выходных данных почти одинаковы, если не идентичны.   -  person Joshua Taylor    schedule 22.04.2014


Ответы (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))
person R Sahu    schedule 21.04.2014
comment
Я попробовал это, и сказать, что в процедуру передано неправильное количество аргументов? Я должен добавить что-то еще? - person Definer; 22.04.2014
comment
@Definer В моем ответе было несколько опечаток. Попробуйте функции еще раз. - person R Sahu; 22.04.2014
comment
Я все еще получаю сообщение об ошибке, сэр, оно говорит: «Ошибка в карте — неправильное количество аргументов, переданных процедуре (функция оценки» (hello b_low)) - person Definer; 22.04.2014
comment
@Definer Можете ли вы опубликовать свою функцию подсчета очков? - person R Sahu; 22.04.2014
comment
(определить (оценочная функция char1 char2) (cond ((char=? char1 char2) 2) ((или (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 (оценочная функция (string-ref s1 index) (string-ref s2 index)))(+ index 1))))) - person Definer; 22.04.2014
comment
@Definer Я обновил ваш пост, указав функции, которые вы предоставили, и мой ответ, чтобы они соответствовали этим функциям. Теперь это должно работать. - person R Sahu; 22.04.2014
comment
спасибо, я пробовал, но когда я его выполняю, ничего не происходит, функция просто завершается - person Definer; 22.04.2014
comment
@Definer извините за небрежные ответы. Теперь это исправлено. Попробуйте еще раз. - person R Sahu; 22.04.2014
comment
нет проблем, сэр. Это дает мне вывод hello_b_l_o_w6› сейчас, предлагая мне ввести снова - person Definer; 22.04.2014
comment
@Definer Не знаю, чем еще могу помочь. С вашими функциями и моими функциями я получаю правильный вывод - (("hello" "b_low") ("hello_" "b_l_ow") ("hello" "_blow")) - person R Sahu; 22.04.2014
comment
Я переименовал несколько своих вещей, так что, может быть, в этом есть небольшая путаница? Вы использовали мой обновленный пример? - person Definer; 22.04.2014
comment
Кроме того, ваша функция подсчета очков относится к моей оценке выравнивания - person Definer; 22.04.2014
comment
Да. Функция print использует alignment-score для вызова get-maximum-score-items. - person R Sahu; 22.04.2014
comment
@ R Саху, есть идеи, почему иначе это не сработает? Может быть, вы могли бы опубликовать или отправить мне по электронной почте, пожалуйста? - person Definer; 22.04.2014
comment
Я очень запутался, как это исправить, пожалуйста, помогите @R Sahu - person Definer; 22.04.2014
comment
Или, может быть, даже опубликуйте свою и мою версию в одном посте, пожалуйста. - person Definer; 22.04.2014
comment
@Definer Я думаю, что это будет плохой услугой для вас, если я помогу вам больше, чем уже сделал. Вы должны быть в состоянии взять его отсюда. - person R Sahu; 22.04.2014