使用 reduce 将平方和应用于多个数字

Apply sum-of-squares to multiple numbers with reduce

我将平方和平方和定义为:

(defun square(x)
  (* x x))
(defun sum-of-squares (x y)
  (+ (square x) (square y)))

然后用 reduce 将它应用到一个数组中:

(reduce 'sum-of-squares '(2 2 2))

但得到的结果是 68 而不是 12。

有什么问题?

减少确实

(sum-of-squares (sum-of-squares 2 2) 2)

也就是

    (sum-of-squares 8 2)

即 64 + 4

您可以通过

获得您期望的结果
(reduce #'+ (mapcar #'square '(2 2 2)))

(reduce #'(lambda (x y) (+ x (square y))) '(2 2 2) :initial-value 0)

或通过定义 sum-of-squares 来获取任意数量的参数。

我看到了你的评论:

any ideas to improve the sum-of-squares?

(defun sum-of-squares (&rest lst)
  (let ((value 0))
    (dolist (element lst value)
      (setq value (+ (square element) value)))))

(sum-of-squares 2 2 2)
;; 12

它比reduce . mapcar快,因为它不会生成中间数据结构。