2017-02-17 50 views
1

Мне нужна помощь в создании функции, которая будет вычислять среднее значение списка, в котором также могут быть буквы. Например:вычислительная средняя или список с буквами на схеме - Dr.Racket

(mean '(1 2 3 4 5)); → 3 
(mean '(1 a 2 b c d e 3)); → 2 
(mean '(a b c d e)); → "Error: no numbers in list" 

До сих пор это то, что у меня есть, но я получаю эту ошибку, что я не понимаю:

(define new_list '()) 

(define (mean lis) 
    (if (null? lis) 
     (display "Error: no numbers in list") 
     (avg(set! new_list (my-filter number? lis))) ;my-filter, filters out everything except numbers 
) 
) 

(define (avg lis) 
    (/ (apply + lis) (length lis))) 

ошибка сбщ я получаю:

mcar: contract violation 
expected: mpair? 
given: #<void> 

Любой помощь будет сильно изложена

ответ

0
; mean-of-numbers computes the mean of a list of numbers (only) 
(define (mean-of-numbers xs) ...) 

; mean computes the mean of the numbers of the list xs ignoring other values 
(define (mean xs) 
    (mean-of-numbers (filter number? xs)) 
0

Er ror находится в следующей строке:

(avg(set! new_list (my-filter number? lis))) ;my-filter, filters out everything except numbers 

Вам не нужно устанавливать! любой новый список. Вы можете просто передать результат моего фильтра fn в avg fn.

Кроме того, оператор if обнаруживает, что список пуст; нет, если в списке нет номера. Следовательно, сообщение об ошибке («Ошибка: нет номеров в списке») необходимо исправить.

Кроме того, функция avg должна обрабатывать деление на 0, как это будет в третьем примере (если в списке нет номера).