2013-10-07 84 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

試試這個:調用map

(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的功能只需要一個值,即每個輸入列表的元素輪流。更好的解決方案是將所有東西都封裝在一個函數中:

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