编写一个函数,得到L2中数字的平均值,大于L1中的最大数字

时间:2011-02-02 01:33:52

标签: list functional-programming scheme

编写一个函数average-above-max,它有两个列表,L1L2L1L2都是简单列表,不包含嵌套列表。两个列表都可能包含非数字元素。

该函数的结果是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)))))

只能从列表中选择数字。

1 个答案:

答案 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

希望有所帮助。