Для справки Я программирую 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
определениями функций, как я уверен, как заставить его работать так, как он предназначен.
Спасибо! Однако один вопрос. В «best-кандидате», что означают «левые кандидаты» и «лучшие»? Как то, что я должен был ввести в окно под окном определения (забыл имя), чтобы проверить функцию «лучший кандидат»? – BBladem83
'(лучший кандидат (список по всем спискам списка кандидатов) null)'. Первый аргумент ('left-кандидаты') представляет собой список структур с« голосованием », а второй (« лучший ») представляет собой накопитель, представляющий лучший« подсчет голосов », найденный до сих пор (« null »для первого вызова). –
О, ладно, я понял. Благодаря!!! – BBladem83