1

我在使用 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)))))
4

1 回答 1

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)))
于 2013-10-07T17:04:30.837 回答