LISP - 没有setq / setf等的最近函数

时间:2015-06-03 14:39:00

标签: lisp cluster-computing closest centroid

我试图写出最近的""函数,在Lisp中,不使用setq / setf等...

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

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

2 个答案:

答案 0 :(得分:1)

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

<div class="container">
<div class="row">
    <div class="col-md-6">
        text
    </div>
    <div class="col-md-6 video-box">
        video
    </div>
</div>
</div>

完成后,您可以将帮助程序放入主函数中:

(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))))

对于正面论证,这当然是(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 :(得分:0)

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

(注意:循环宏在某一点使用set: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))