2014-12-17 3 views
0

Для справки Я программирую Racket в DrRacket.Racket - использование двух списков и вывод строки

«Язык», который я использую, - Intermediate Student with lambda.

При этом я должен отметить, что они не используют функции высокого порядка или лямбда.

Я пишу функцию под названием winner-by-all, которая расходует список кандидатов и список голосов и возвращает имя победителя (одно с наибольшим количеством голосов).

Я могу получить его для вывода наибольшего числа, но не имя самого победителя (строка).

Вот моя winner-by-all функция, которая не является правильным:

;; Signature: winner-by-all: list-of-candidates list-of-votes -> string 
;; Purpose: Consumes a list of candidates and a list of votes, and returns 
;;   the name of the winner by the winner-takes-all strategy. 
;; Tests: 
(check-expect (winner-by-all empty empty) empty) 
(check-expect (winner-by-all listofCandidates listofVotes) "Blake") 
;; Define: 
(define (winner-by-all aloc alov) 
    (cond 
    [(empty? aloc) empty] 
    [else (voting-tally-candidate (max (voting-tally-numVotes (first (tally-by-all listofCandidates listofVotes)))))] 
    ) 
) 

При запуске, я получаю сообщение об ошибке сказав:

voting-tally-candidate: expects a voting-tally, given 3 

Так что моя функция имеет смысл, вот несколько других части моего кода, чтобы заполнить пробелы:

tally-by:

;; Signature: tally-by: (helper function) list-of-candidates list-of-votes -> list-of-Voting-Tallies 
;; Purpose: Consumes a helper function, a list of candidate names, and a list of 
;;   votes and produces a list of voting-tallies. 
;; Define: 
(define (tally-by helper aloc alov) 
    (cond 
    [(empty? aloc) empty] 
    [else (cons (make-voting-tally (first aloc) 
            (helper (first aloc) alov)) 
       (tally-by helper (rest aloc) alov))] 
    ) 
) 

tally-by-all:

;; Signature: tally-by-all: list-of-candidates list-of-votes -> list-of-Voting-Tallies 
;; Purpose: Consumes a list of candidate names and a list of votes and produces a 
;;   list of voting-tallies. 
;;   (Winner-Takes-All strategy). 
;; Tests: 
(check-expect (tally-by-all empty empty) empty) 
(check-expect (tally-by-all listofCandidates listofVotes) (cons (make-voting-tally "Blake" 3) 
                  (cons (make-voting-tally "Ash" 0) 
                  (cons (make-voting-tally "Bob" 0) 
                  (cons (make-voting-tally "Will" 0) 
                  (cons (make-voting-tally "Joey" 0) empty)))))) 
;; Define: 
(define (tally-by-all aloc alov) 
    (tally-by top-votes-for aloc alov)) 

listofVotes:

;; Data Definition 
(define-struct vote (choice1 choice2 choice3)) 
;; A vote is a structure: (make-vote String String String). 
;; interp. 3 candidates that one person has voted for (String). 

(define vote1 
    (make-vote "Blake" "Joey" "Will")) 

(define vote2 
    (make-vote "Blake" "Bob" "Ash")) 

(define vote3 
    (make-vote "Blake" "Ash" "Blake")) 

(define listofVotes 
    (list vote1 vote2 vote3)) 

top-votes-for:

;; Signature: top-votes-for: string list-of-strings -> number 
;; Purpose: Consumes a name and a list of votes and produces the number of 
;;   times that the given name was the first choice vote in the list of votes. 
;;   (This tallies points under winner-takes-all strategy.) 
;; Tests: 
(check-expect (top-votes-for "Blake" empty) 0) 
(check-expect (top-votes-for "Blake" listofVotes) 3) 
(check-expect (top-votes-for "Bob" listofVotes) 0) 
(check-expect (top-votes-for "Ash" listofVotes) 0) 
(check-expect (top-votes-for "Joey" listofVotes) 0) 
(check-expect (top-votes-for "Will" listofVotes) 0) 
;; Define: 
(define (top-votes-for cand alov) 
    (cond 
    [(empty? alov) 0] 
    [(string=? (vote-choice1 (first alov)) cand) (+ 1 (top-votes-for cand (rest alov)))] 
    [else (top-votes-for cand (rest alov))] 
    ) 
) 

listofCandidates:

(define listofCandidates 
    (list "Blake" "Ash" "Bob" "Will" "Joey")) 

voting-tally структура:

;; Data Definition 
(define-struct voting-tally (candidate numVotes)) 
;; A voting-tally is a structure: (make-voting-tally String Number). 
;; interp. a candidate (String) and how many votes said 
;;   candidate has gotten (Number). 

Я надеюсь, что кто-то сможет помочь мне с winner-by-all определениями функций, как я уверен, как заставить его работать так, как он предназначен.

ответ

1

В Intermediate студент с лямбда вы можете использовать функции высокого порядка, таких как argmax:

(define (winner-by-all aloc alov) 
    (cond 
    [(empty? aloc) empty] 
    [else (voting-tally-candidate (argmax voting-tally-numVotes 
              (tally-by-all listofCandidates listofVotes)))] 
    ) 
) 

Если вам действительно нужно реализовать без функций высокого порядка и лямбда-выражения, вы можете имитируйте argmax своей собственной функцией, которая рекурсивно перебирает все результаты tally-by-all и выбирает число голосов с наибольшим количеством голосов.

(define (best-candidate left-candidates best) 
    (if (null? left-candidates) 
     best 
     (let ([fst (car left-candidates)]) 
     (if (or (null? best) 
       (> (voting-tally-numVotes fst) (voting-tally-numVotes best))) 
      (best-candidate (cdr left-candidates) fst) 
      (best-candidate (cdr left-candidates) best))))) 

Затем используйте best-candidate, чтобы сделать работу вместо argmax:

(define (winner-by-all aloc alov) 
    (cond 
    [(empty? aloc) empty] 
    [else (voting-tally-candidate (best-candidate (tally-by-all listofCandidates listofVotes) null))] 
    ) 
) 
+0

Спасибо! Однако один вопрос. В «best-кандидате», что означают «левые кандидаты» и «лучшие»? Как то, что я должен был ввести в окно под окном определения (забыл имя), чтобы проверить функцию «лучший кандидат»? – BBladem83

+1

'(лучший кандидат (список по всем спискам списка кандидатов) null)'. Первый аргумент ('left-кандидаты') представляет собой список структур с« голосованием », а второй (« лучший ») представляет собой накопитель, представляющий лучший« подсчет голосов », найденный до сих пор (« null »для первого вызова). –

+0

О, ладно, я понял. Благодаря!!! – BBladem83

Смежные вопросы