2011-02-02 4 views
-2

関数average-above-maxには、L1L2の2つのリストが必要です。 L1L2は両方ともネストされたリストを含まない単純リストです。どちらのリストも数字でない要素を持つことがあります。L1の最大数値より大きいL2の数値の平均を取得する関数を作成します。

結果は、L2の数値の平均がL1の最大値よりも大きいことです。

L1に数字がない場合は、平均を計算するためにL2のすべての数字を使用する必要があります。

L2に数字がない場合、平均は0です。

たとえば、(average-above-median (list 2 'a 1) (list 'b 5 3 1))の結果は4である必要があります。

そして、これは私が持っているものです:のみリストから番号を選び

(define (filter l n) 
    (cond 
    ((null? l) empty) 
    ((number? (car l)) (cons (car l) (filter (cdr l)))) 
    (else (filter (cdr l))))) 

+3

注文。スキームで。 CS101の宿題? –

+0

@モーロン - 私はCS101の講義スキームを見つけることに驚くだろう。しかし、はい、宿題のように見えます。 – Olhovsky

+0

私は[宿題]タグを追加する編集を拒否しました。これは、私たちがもうメタタグをやっていないと信じているからです。 –

答えて

1

は、CS101を見ていないが、私はあなたの問題を解決を願って:

(define (avg xs) 
    (/ (foldl + 0 xs) (length xs))) 

(define (list-max xs) 
    (let loop ((xs xs) 
      (e (car xs))) 
    (if (empty? (cdr xs)) 
     e 
     (loop (cdr xs) (max e (car xs)))))) 

(define (average-above-median xs ys) 
    (let* ((xsnum (filter number? xs)) 
     (ysnum (filter number? ys))) 
    (if (empty? ysnum) 
     0 
     (if (empty? xsnum) 
      (avg ysnum) 
      (avg (filter (lambda(x) (> x (list-max xsnum))) ysnum)))))) 

例:

> (average-above-median (list 2 'a 1) (list 'b 5 3 1)) 
4 
> (average-above-median (list) (list 'b 5 3 1)) 
3 
> (average-above-median (list 2 'a 1) (list)) 
0 
> (average-above-median (list) (list)) 
0 

に役立ちます希望は。

+0

私は 'list-max'への呼び出しも除外します。おそらくBig Oをもっと大きくするからです.-D –

関連する問題