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

DrRacket - Display all the values in a list that are above average

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

(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))])))

很明显我的代码有问题...有人可以帮助我吗? (average-filter (cons 40 (cons 30 empty)) 的错误信息是:

cons: expects 2 arguments, but found only 1

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

现在关于 average-filter 的真正问题:它与您上一个问题的错误相同,您必须 而不是 cons 部分放在开头,这不是它的工作原理。您应该使用当前元素 和递归调用的结果 调用 cons,以构建包含结果的列表。而你必须有一个基本情况,想一想:当你运行没有要遍历的元素时会发生什么?那就是你需要 return 一个空列表的地方:

(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 具有递归调用结果的当前元素,当这样做有意义时。