2013-10-07 10 views
1

У меня возникла проблема с использованием функции карты, чтобы вернуть список квадратов отклонения заданного набора чисел. Я написал функцию квадратного отклонения следующим образом, но я не знаю, как это сопоставить. Есть ли способ изменить функцию квадратного отклонения, чтобы он не принимал «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))))) 
+0

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

ответ

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 «s только ожидает одно значение, которое по очереди является элементом списка входных данных. Еще более приятным решением было бы упаковать все в одну функцию:

(define (square-of-deviation lst) 
    (let ((avg (average lst))) 
    (map (lambda (x) (expt (- x avg) 2)) lst)))