gpt4 book ai didi

lisp - 使用 mapcar 计算欧式距离并应用

转载 作者:太空宇宙 更新时间:2023-11-03 18:55:43 27 4
gpt4 key购买 nike

我正在尝试创建一个函数,使用 apply 和 mapcar 来计算它。

在使用第一个 mapcar 获取列表中 p-q 的所有差异后,我被卡住了。如何对列表中的所有元素求平方并求和?

enter image description here

(defun euclidean-distance-map (p q)
;; get a list of differences of p - q
(mapcar #'- p q))

最佳答案

高阶函数

如果您真的需要坚持使用 HOF(reducemapcar),那么这里有几个选项:

(defun euclidean-distance-map (p q)
(let ((d (mapcar #'- p q))) ; get a list of differences of p & q
(sqrt (reduce #'+ (mapcar #'* d d)))))

(defun euclidean-distance-map (p q)
(sqrt (reduce #'+ (mapcar (lambda (x) (* x x)) (mapcar #'- p q)))))

(defun euclidean-distance-map (p q)
(sqrt (reduce #'+ (mapcar (lambda (x y)
(let ((d (- x y)))
(* d d)))
p q))))

应用减少

使用 apply而不是 reduce 是一个的想法(因为 call-arguments-limit 和风格),但是你开始吧:

(defun euclidean-distance-map (p q)
(let ((d (mapcar #'- p q))) ; get a list of differences of p & q
(sqrt (apply #'+ (mapcar #'* d d)))))

(defun euclidean-distance-map (p q)
(sqrt (apply #'+ (mapcar (lambda (x) (* x x)) (mapcar #'- p q)))))

(defun euclidean-distance-map (p q)
(sqrt (apply #'+ (mapcar (lambda (x y)
(let ((d (- x y)))
(* d d)))
p q))))

内存

如果没有众所周知的“足够聪明的编译器”,mapcar 分配的存储空间会立即被丢弃。不过,这不一定是现代分代 GC 的问题。

迭代

注意迭代版本使用loop同样清楚:

(defun euclidean-distance-map (p q)
(sqrt (loop for x in p
and y in q
for d = (- x y)
sum (* d d))))

Lisp 是一种多范式语言,您不必强制自己进入 specific框架。

关于lisp - 使用 mapcar 计算欧式距离并应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35323798/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com