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

时间:2019-10-14 18:02:49

标签: racket

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

(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个

1 个答案:

答案 0 :(得分:0)

几点注释:在average过程中,不需要在分母上加1,但是当它为零时,您应该处理。还要注意,您可以通过只计算一次average来改善您的解决方案,对于输入列表来说,它是相同的,因此您不需要在每次迭代时都重新计算它。而且,请勿调用您的参数listlog,它们将与现有过程冲突。

现在要解决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))]))

请遍历输入列表,花一些时间研究构建输出列表的正确方法,请注意,您需要:

  1. 处理输入列表为空的情况。
  2. cons,在有意义的情况下使用递归调用的结果来显示当前元素。