Напишите функцию, которая получает среднее число чисел в L2, которые больше, чем наибольшее число в L1 - PullRequest
0 голосов
/ 02 февраля 2011

Напишите функцию average-above-max, которая принимает 2 списка, 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)))))

, который выбирает только числа из списка.

1 Ответ

1 голос
/ 02 февраля 2011

Не видел 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

Надеюсь, это поможет.

...