DrRacket - отображать все значения в списке выше среднего - PullRequest
0 голосов
/ 14 октября 2019

Я создаю функцию, которая использует список чисел и производит элементы в списке, которые выше среднего. Ниже мой код:

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

Итак, очевидно, что-то не так с моим кодом ... Может кто-нибудь мне помочь? Сообщение об ошибке для (средний фильтр (минусы 40 (минусы 30 пусто)):

минусы: ожидается 2 аргумента, но найдено только 1

1 Ответ

0 голосов
/ 14 октября 2019

Пара комментариев: в процедуре average нет необходимости добавлять 1 к знаменателю, но вы должны обрабатывать случай, когда он равен нулю. Также обратите внимание, что вы можете улучшить свое решение, рассчитав average только один раз, оно будет одинаковым для списка ввода, поэтому вам не нужно пересчитывать его на каждой итерации. И, пожалуйста, не называйте ваши параметры list или log, они будут конфликтовать с существующими процедурами.

Теперь для реальной проблемы с 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 текущий элемент с результатом рекурсивного вызова, когда это имеет смысл сделать.
...