0

我正在尝试在 Lisp 中编写“最接近”的函数,而不使用 setq/setf 等...

该函数查找给定向量的最近向量(在列表列表中查找)。

我试过但没有套装太难了,非常感谢。

4

2 回答 2

1

通常变量的更新是通过递归来完成的:

(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+正面论证的愚蠢实现。

于 2015-06-03T15:11:43.007 回答
0

如果没有设置,则返回列表列表,以防有关系:

(注意:循环宏在某些时候使用设置: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))
于 2015-06-03T21:19:30.893 回答