2011-02-02 13 views
-2

編寫函數average-above-max,其中需要2個列表和L2L1L2都是簡單的列表,它們不包含嵌套列表。這兩個列表都可能包含非數字元素。編寫一個函數,獲取L2中大於L1中最大數的平均數

該函數的結果是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

訂單。在Scheme中。 CS101作業? – 2011-02-02 01:37:01

+0

@Moron - 我很驚訝地發現CS101課程教學計劃。但是,看起來像功課。 – Olhovsky 2011-02-02 01:44:14

回答

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 

希望有所幫助。