【问题标题】:numbers in a list greater than the average [duplicate]列表中的数字大于平均值[重复]
【发布时间】:2020-02-14 17:00:21
【问题描述】:

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

(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))-> 空 当我应该得到: (缺点 3 为空)

【问题讨论】:

    标签: list recursion racket


    【解决方案1】:

    由于 log 在每次递归调用时都会缩小,(mean 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)))
    

    【讨论】:

      猜你喜欢
      • 2021-03-18
      • 2017-03-15
      • 2014-12-30
      • 2020-12-05
      • 2019-02-27
      • 2020-12-26
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多