我正在尝试在 Lisp 中编写“最接近”的函数,而不使用 setq/setf 等...
该函数查找给定向量的最近向量(在列表列表中查找)。
我试过但没有套装太难了,非常感谢。
我正在尝试在 Lisp 中编写“最接近”的函数,而不使用 setq/setf 等...
该函数查找给定向量的最近向量(在列表列表中查找)。
我试过但没有套装太难了,非常感谢。
通常变量的更新是通过递归来完成的:
(defun main-function (arg)
(main-function-helper arg 0 1))
(defun main-function-helper (arg var1 var2)
(if (= arg var1)
var2
(main-function-helper arg (1+ var1) (1+ var2))))
完成后,您可以将助手放入 main 函数中:
(defun main-function (arg)
(labels ((helper (var1 var2) ; arg left out since it's not changed
(if (= arg var1)
var2
(helper (1+ var1) (1+ var2)))))
(helper 0 1)))
这当然是1+
正面论证的愚蠢实现。
如果没有设置,则返回列表列表,以防有关系:
(注意:循环宏在某些时候使用设置:P)
(defun euclid (v1 v2)
(sqrt (loop for x in v1 for y in v2 sum
(expt (- x y) 2))))
(defun closest (target listoflists distancefn)
(loop for l in listoflists for d = (apply distancefn (list target l))
minimizing d into min
collecting (list l d) into col
finally (return
(loop for (vec dis) in col when
(eql dis min) collect vec))))
(closest '(1 2 3) '((1 2 2) ( 1 2 2) ( 2 2 2)) #'euclid)
> ((1 2 2) (1 2 2))