Scheme中的Map函数实践

时间:2013-10-07 16:58:22

标签: function scheme map-function deviation

我无法使用map函数返回给定数字组偏差的平方列表。我写了我的偏差方函数如下,但我不知道如何映射这个。有没有办法纠正我的偏差平方函数,以便它不会将“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)))))

1 个答案:

答案 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的函数只需要一个值,依次是每个输入列表的元素。更好的解决方案是将所有内容打包在一个功能中:

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