DrRacket-显示列表中高于平均值的所有值

DrRacket-显示列表中高于平均值的所有值,racket,Racket,我正在创建一个函数,它使用一个数字列表,并生成列表中高于平均值的元素。 下面是我的代码: (define (listlength list) (cond ((empty? list) 0) (else (+ 1 (listlength (rest list)))))) (define (listsum list) (cond [(empty? list) 0] [else (+ (first list)

我正在创建一个函数,它使用一个数字列表,并生成列表中高于平均值的元素。 下面是我的代码:

(define (listlength list)
        (cond
            ((empty? list) 0)
            (else (+ 1 (listlength (rest list))))))

(define (listsum list)
  (cond
    [(empty? list) 0]
    [else (+ (first list)
             (listsum (rest list)))]))

(define (average log)
  (/ (listsum log) (+ (listlength log) 1)))

(define (average-filter log)
  (cons
  (cond
    [(> (first log) (average log)) (first log)]
    [else (average-filter (rest log))])))
很明显我的代码有问题…有人能帮我吗? 平均过滤器(cons 40(cons 30为空)的错误消息为:

缺点:需要2个参数,但只找到1个


几个注释:在
average
过程中,不需要在分母中添加1,但应该处理分母为零的情况。还要注意,您可以通过只计算一次
average
来改进您的解决方案,它对于输入列表是相同的,因此您不需要在每次迭代中重新计算它。And请不要调用您的参数
列表
日志
,它们将与现有过程冲突

现在来看一下
average filter
的真正问题:这与您之前的问题是相同的错误,您不能将
cons
部分放在开头,这不是它的工作方式。您应该使用当前元素和递归调用的结果调用
cons
,以构建一个包含结果的列表。并且您必须有一个基础在这种情况下,思考一下:当您没有要遍历的元素时会发生什么?这就是您需要返回空列表的地方:

(define (average-filter lst)
  (cond
    [(empty? lst) empty]
    [(> (first lst) (average lst))
     (cons (first lst) (average-filter (rest lst)))]
    [else (average-filter (rest lst))]))
请花一些时间研究通过遍历输入列表来构建输出列表的正确方法,请注意,您需要:

  • 处理输入列表为空时的情况
  • cons
    当前元素和递归调用的结果,如果这样做有意义

  • 首先,感谢您的帮助!这里还有一个问题:因为(平均lst)在(平均过滤器lst)它总是计算列表其余部分的平均值,而不是原始列表的平均值。那么如何只计算一次平均lst呢?@Sillage方法是编写另一个函数,将平均值作为参数传递给
    average filter
    (您需要添加一个额外的参数).无论如何,这不是强制性的,你的答案是有效的,这不是最快的方法,但是对于小列表(少于1000个元素)你甚至不会注意到。对不起,如果我听起来很愚蠢,那么既然lst目前还没有定义,我该如何定义一个新参数为average lst呢?不要太担心,你的答案很好。如果你坚持这样做,只需像这样声明这个过程:
    (define(average filter lst)(average filter helper lst(average lst))
    。和
    (define(average filter helper lst avg).
    是您的实现,只是您不需要每次都计算
    平均值
    ,只需使用从
    平均值过滤器
    调用时收到的参数即可。同样,如果这看起来太麻烦,请保持当前的状态。