Как мне создать ответ с функцией правильного ответа в Racket? - PullRequest
1 голос
/ 14 апреля 2020

clicker-results использует список списков ClickerResponse, называемый answers. Функция производит оценку кликера в процентах на основе полученных ответов. Оценки кликера определяются следующим образом.

• Если ответ студента соответствует правильному ответу, студент получает 2 балла

• Если ответ студента не соответствует правильному ответу, студент получает 1 балл

• Если студент не дал ответа «НС», он получает 0 баллов

То, что у меня есть до сих пор.

(define (clicker-results grades)
   (lambda (s count)
     (+ count
        (cond
          [(empty? grades) 0]
          [(equal? (first (first grades)) (first (rest (first grades)))) 2]
          [(not (equal? (first (first grades)) (first (rest (first grades))))) 1]
        [else 0]))))

Хотя я не получаю вывод.

Примеры:

(clicker-results (list (list 'a 'a))) ⇒ 100
(clicker-results (list (list 'a 'a) (list 'NA 'b) 
(list 'c 'b) (list 'd 'e))) ⇒ 50

1 Ответ

2 голосов
/ 14 апреля 2020

Я вижу, что вы все еще боретесь с рекурсией :( что lambda внутри не имеет ничего общего с правильным ответом. Вы взглянули на шаблон, как построить рекурсивное решение? ?

А где вы вызываете рекурсию? И как вы конвертируете ответ из баллов в процент?

Это больше похоже на это, и обратите внимание, что вы должны обработать 'NA явно, и лучше иметь отдельную вспомогательную процедуру для расчета процента:

(define clicker-results
  (lambda (answers)
    (* 100.0 (/ (clicker-points answers) (* 2 (length answers))))))

(define clicker-points
  (lambda (answers)
    (cond [(empty? answers) 0]
          [(equal? (first (first answers)) 'NA)
           (clicker-points (rest answers))]
          [(equal? (first (first answers)) (first (rest (first answers))))
           (+ 2 (clicker-points (rest answers)))]
          [else (+ 1 (clicker-points (rest answers)))])))

Результаты будут:

(clicker-results (list (list 'a 'a)))
=> 100
(clicker-results (list (list 'a 'a) (list 'NA 'b) (list 'c 'b) (list 'd 'e)))
=> 50
...