使用 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
快,因为它不会生成中间数据结构。
我将平方和平方和定义为:
(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
快,因为它不会生成中间数据结构。