Пара комментариев: в процедуре 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))]))
Пожалуйста, потратьте некоторое время на изучение правильного способа построения выходного списка в результате обхода входного списка, обратите внимание, что вам необходимо:
- Обрабатывать случай, когда список ввода пуст.
cons
текущий элемент с результатом рекурсивного вызова, когда это имеет смысл сделать.