Lisp 根据条件从循环返回

Lisp 根据条件从循环返回,lisp,common-lisp,Lisp,Common Lisp,我有以下功能: (defun chooseBest (TSPs dTSPs) (let ((minim (minPos dTSPs 0 0)) (j 0) (best nil)) (loop for i in TSPs do (cond ((= j minim) (progn (setf best i) (setq j (+ j 1)))) (t (setq j (+ j 1)))))

我有以下功能:

(defun chooseBest (TSPs dTSPs)
    (let ((minim (minPos dTSPs 0 0)) (j 0) (best nil)) 
        (loop for i in TSPs
             do (cond ((= j minim) (progn (setf best i) (setq j (+ j 1))))
                      (t (setq j (+ j 1)))))        
        best))
此函数接收两个列表:

TSPs-类似以下路径的列表:

(((1 3600 2300) (2 3100 3300))
 ((3 4700 5750) (22 6650 2300) (23 5400 1600)))
以及与以下各项相关的距离列表:

(distancePath1 distancePath2)
函数minPos返回数字较小的列表位置,即距离较小的路径

因此,chooseBest函数将返回较小的路径

但我想改进它,因为它会搜索整个列表中的小数字,这是一种浪费,因为最小值有那个位置。例如,minim是2,但它正在评估一个包含100条路径的TSPs列表,我想立即返回2并中断循环,但返回不起作用…

如果您想要列表的第n个元素,可以使用函数n:n位置列表

如果要从循环返回,可以使用运算符return:

如果需要列表的第n个元素,可以使用函数n:n position list

如果要从循环返回,可以使用运算符return:


让我们稍微修改一下你的函数

首先,使用更好的缩进:

在cond内不需要progn:

增量j可以通过incf完成:

=>

可以将let变量移动到循环中

=>

对于j,从0开始一个计数器,用…=声明一个变量,该变量在开始时计算,而不是在每次迭代时计算

返回和条件

在循环中,我们可以多次使用if…do、else…do、when和return

用于搜索列表和序列的函数


现在,如果你想在列表中找到一个元素,你有很多函数:find,nth,search,position,…因为minPos返回一个索引,你可能需要nth索引列表或elt序列索引。

让我们稍微修改一下你的函数

首先,使用更好的缩进:

在cond内不需要progn:

增量j可以通过incf完成:

=>

可以将let变量移动到循环中

=>

对于j,从0开始一个计数器,用…=声明一个变量,该变量在开始时计算,而不是在每次迭代时计算

返回和条件

在循环中,我们可以多次使用if…do、else…do、when和return

用于搜索列表和序列的函数


现在,如果你想在列表中查找一个元素,你有很多函数:find,nth,search,position,…因为minPos返回一个索引,你可能需要nth index list或elt sequence index。

很多循环示例都带有条件和return:以及按顺序搜索元素的函数find,search,elt,index,n…许多循环示例,带有条件和返回:以及用于按顺序搜索元素的函数find、search、elt、index、n…
CL-USER 15 > (nth 0 '(((1 3600 2300) (2 3100 3300))
                      ((3 4700 5750) (22 6650 2300) (23 5400 1600))))
((1 3600 2300) (2 3100 3300))

CL-USER 16 > (nth 1 '(((1 3600 2300) (2 3100 3300))
                      ((3 4700 5750) (22 6650 2300) (23 5400 1600))))
((3 4700 5750) (22 6650 2300) (23 5400 1600))
CL-USER > (loop for i from 10
                when (= i (expt (isqrt i) 2))
                do (return i))
16
(defun chooseBest (TSPs dTSPs)
  (let ((minim (minPos dTSPs 0 0))
        (j 0)
        (best nil))
    (loop for i in TSPs
       do (cond ((= j minim)
                 (progn (setf best i)
                        (setq j (+ j 1))))
                (t 
                 (setq j (+ j 1)))))
    best))
       do (cond ((= j minim)
                 (setf best i)
                 (setq j (+ j 1)))
                (t 
                 (setq j (+ j 1)))))
                 (setq j (+ j 1)))
                 (incf j)
  (let ((minim (minPos dTSPs 0 0))
        (j 0)
        (best nil))
    (loop for i in TSPs
(loop for it in TSPs
      for j from 0
      with minim = (minPos dTSPs 0 0)
      with best
      do …)
(defun chooseBest (TSPs dTSPs)
  (loop for i in TSPs
     for j from 0
     with minim = (minPos dTSPs 0 0)
     with best
     if (= j minim)
     do (progn (setf best i)
               (incf j))
     else
     do (incf j)
     finally (return best)))