作为参考,我使用Scheme
在DrRacket
进行编程。
我试图计算一个名字(字符串)是投票列表中的第一选择的次数,但似乎无法弄明白。
对于问题的某些背景,
投票包括一个人投票的三名候选人的姓名。这被定义为结构:(define-struct vote(choice1 choice2 choice3))。
top-votes-for函数应该使用名称和投票列表,并产生给定名称是投票列表中第一选择投票的次数。
这是我的代码(注意定义不正确):
;; Data Definition
(define-struct vote (choice1 choice2 choice3))
;; A vote is a structure: (make-vote String Number 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 "Bob" "Ash" "Blake"))
(define listofVotes
(list vote1 vote2 vote3))
;; 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.
;; Tests:
(check-expect (top-votes-for "Blake" empty) 0)
(check-expect (top-votes-for "Blake" listofVotes) 2)
(check-expect (top-votes-for "Bob" listofVotes) 1)
(check-expect (top-votes-for "Ash" listofVotes) 0)
;; Define:
(define (top-votes-for cand alov)
(cond
[(empty? alov) 0]
[(string=? (vote-choice1 cand) cand) 1]
[else ((first alov) (top-votes-for (rest alov)))]
)
)
提前谢谢!
答案 0 :(得分:1)
您对top-votes-for
的定义是错误的。这是修正后的解决方案的骨架版本:
(define (top-votes-for cand alov)
(cond ((empty? alov) 0)
((string=? (vote-choice1 <???>) cand)
(add1 <???>))
(else (top-votes-for cand (rest alov)))))
我实际上给了你大部分解决方案。如果您理解上面的代码,其余部分应该很容易理解。