编写一个函数average-above-max
,它有两个列表,L1
和L2
。 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)))))
只能从列表中选择数字。
答案 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
希望有所帮助。