我有一个成绩列表,
(define grades
(list (make-grade 'D 62) (make-grade 'C 79) (make-grade 'A 93) (make-grade 'B 84)
(make-grade 'F 57) (make-grade 'F 38) (make-grade 'A 90) (make-grade 'A 95)
(make-grade 'C 76) (make-grade 'A 90) (make-grade 'F 55) (make-grade 'C 74)
(make-grade 'A 92) (make-grade 'B 86) (make-grade 'F 43) (make-grade 'C 73)))
;; A Grade is: (make-grade Symbol Number)
(define-struct grade (letter num))
我试图通过使用foldr找到这个成绩结构列表中的最大数字,
;; best-grade: Lof[Grade] -> Number
;; find the highest Grade in list
(define (best-grade log)
(cond
[(empty? log) 0]
[(cons? log) (foldr max (grade-num (first log)) (grade-num (rest log)))]))
(check-expect (best-grade grades) 95)
相反,它给出了年级:预期成绩,给定(列表(制作等级' C 79)(制作等级' A 93)(制作等级&#39) ; B 84)(制作等级' F 57)(制作等级' F 38)(制作等级' A 90)(制作等级' A 95)(制作 - 等级' C)(制作等级' A 90)(制作等级' F 55)(制作等级' C 74)(制作等级' A 92)(制作等级' ...
我非常确定(grade-num(第一次登录))输入成绩的数字值。谁知道为什么???谢谢。
答案 0 :(得分:4)
这是正确的:
(grade-num (first log))
因为(first log)
是grade
类型的结构。
但这不正确:
(grade-num (rest log))
因为(rest log)
是一个列表,而不是grade
类型的结构。
编辑:您似乎对foldr
期望的参数感到困惑。请查看foldl
的文档(是,foldl
,而不是foldr
)。 (Here)
答案 1 :(得分:1)
foldr
(或foldl
,就此而言)先后使用2个参数调用您提供的过程:
注意:在Racket中,参数的顺序与标准Scheme相反
所以foldr
已经为你做了循环。
因此,示例实现将是
(define (best-grade log)
(foldr
(lambda (grade best) ; procedure
(let ((g (grade-num grade)))
(if (or (not best) (> g best)) g best)))
#f ; intitial value for best
log)) ; list to process
然后
> (best-grade grades)
95
> (best-grade '())
#f
在这种情况下,usinf foldl
会产生相同的结果,因此更可取,正如@DWilches指出的那样,因为它更有效。
答案 2 :(得分:0)
;; best-grade: Lof[Grade] -> Number
;; find the highest Grade in list
(define (best-grade log)
(cond
[(empty? log) 0]
[(cons? log) (foldr max 0 (log->lon log))]))
(check-expect (best-grade grades) 95)
;; log->lon: Lof[Grade] -> Lof[Number]
;; contains just the numerical grade
(define (log->lon log)
(map grade-num log))