2017-02-17 61 views
1

文字を含むことができるリストの平均を計算する関数を作成するのに役立つ必要があります。たとえば:Scheme - 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> 

助けが大いにapriciatedされるでしょう

答えて

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あなたは次の行にあります:

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

あなたは設定する必要はありません!新しいリスト。 my-filter fnの結果をavg fnに渡すことができます。

また、if文は、リストが空であるかどうかを調べます。リストに番号がない場合ではありません。したがって、エラーメッセージ(「エラー:番号はリストにありません」)を修正する必要があります。

さらに、3番目の例(リストに番号がない場合)で発生するように、avg関数は0による除算を処理する必要があります。