使用foldr查找列表中最大数字的方案

时间:2014-11-23 00:43:48

标签: scheme racket

我有一个成绩列表,

(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(第一次登录))输入成绩的数字值。谁知道为什么???谢谢。

3 个答案:

答案 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))