Практика функции карты в схеме

У меня возникли проблемы с использованием функции карты для возврата списка квадратов отклонения заданного набора чисел. Я написал свою функцию квадрата отклонения следующим образом, но не знаю, как ее отобразить. Есть ли способ исправить мою функцию квадрата отклонения, чтобы она не принимала «l» в качестве параметра? Если бы я написал такую ​​функцию, я бы знал, как ее отобразить.

(define (square-of-deviation l)
 (define (square-of-deviation-h n)
  (if (null? n)
   '()
   (cons (expt (- (car n) (average l)) 2) 
         (square-of-deviation-h (cdr n)))))
(square-of-deviation-h l))

Я написал функцию, которую я мог бы использовать для отображения, но она требует, чтобы я дважды передал один и тот же список при тестировании своего кода:

(define (square-of-deviation-2 l)
  (lambda (x) (expt (- x (average l)) 2)))

(map (square-of-deviation-2 '(1 2 3 4 5)) '(1 2 3 4 5))

Должен ли я изменить свою функцию карты здесь? Я написал это следующим образом:

(define (map f items)
  (if (null? items)
   '()
   (cons (f (car items))
         (map f (cdr items)))))

person John Friedrich    schedule 07.10.2013    source источник
comment
Мне неудобно использовать функции сопоставления в таком примере. Моя верхняя функция работает по назначению, но книга, из которой я учусь, просит меня написать это, используя функцию карты.   -  person John Friedrich    schedule 07.10.2013


Ответы (1)


Попробуй это:

(define lst '(1 2 3 4 5))

(define avg (average lst))

(define (square-of-deviation-2 x)
  (expt (- x avg) 2))

(map square-of-deviation-2 lst)

Обратите внимание, что вам нужно вычислить среднее значение один раз, поэтому вы можете сделать это перед вызовом map, потому что функция map ожидает только одно значение, которое, в свою очередь, является каждым из элементов входного списка. Еще более приятным решением было бы упаковать все в одну функцию:

(define (square-of-deviation lst)
  (let ((avg (average lst)))
    (map (lambda (x) (expt (- x avg) 2)) lst)))
person Óscar López    schedule 07.10.2013