List 列表中大于平均值的数字

List 列表中大于平均值的数字,list,recursion,racket,List,Recursion,Racket,我不太确定我做错了什么。我需要编写一个程序,过滤低于一系列数字平均值的数字,只保留大于所有数字平均值的数字 (define (total lon) (cond [(empty? lon) 0] [else (+ first lon) (total (rest lon)))])) (define (mean alon) (/ (total alon) (length alon))) (define (average-filter log) (cond [(empty? log)

我不太确定我做错了什么。我需要编写一个程序,过滤低于一系列数字平均值的数字,只保留大于所有数字平均值的数字

(define (total lon)
(cond
[(empty? lon) 0]
[else (+ first lon) (total (rest lon)))]))


(define (mean alon)
(/ (total alon) (length alon)))

(define (average-filter log)
  (cond
    [(empty? log) empty]
    [(> (first log) (mean log))
     (cons (first log) (average-filter (rest log)))]
    [else (average-filter (rest log))]))
我希望它能删除所有低于平均水平的,但最终我得到的是一个空列表

前 (平均筛选器(列表1 2 3))->空 当我应该得到:
(cons 3为空)

因为每次递归调用时
log
都会收缩
(平均日志)
也会改变

计算一次平均值:

(define (average-filter log)
  (average-filter-h log (mean log)))
然后过滤较大的数字:

(define (average-filter-h log mean)
  (cond
    [(empty? log) empty]
    [(> (first log) mean)
     (cons (first log) (average-filter-h (rest log) mean))]
    [else (average-filter-h (rest log) mean)]))
旁注:

您还可以使用抽象来更简洁地表达这一点:

(define (mean alon)
  (/ (apply + alon) (length alon)))

(define (average-filter log)
  (let ([m (mean log)])
    (filter (λ (x) (> x m)) log)))

因为
log
在每次递归调用时收缩
(平均日志)
也会改变

计算一次平均值:

(define (average-filter log)
  (average-filter-h log (mean log)))
然后过滤较大的数字:

(define (average-filter-h log mean)
  (cond
    [(empty? log) empty]
    [(> (first log) mean)
     (cons (first log) (average-filter-h (rest log) mean))]
    [else (average-filter-h (rest log) mean)]))
旁注:

您还可以使用抽象来更简洁地表达这一点:

(define (mean alon)
  (/ (apply + alon) (length alon)))

(define (average-filter log)
  (let ([m (mean log)])
    (filter (λ (x) (> x m)) log)))