复杂循环优化

Complex Loop Optimization

我有一个函数,它接受一个状态和一个动作,returns一个新状态,它是在原始状态中应用接收到的动作所产生的。

我的问题是我编写了一个复杂的代码loop,我想对其进行优化,以便它能给我带来更清晰的阅读功能和更优化的功能。

我有这个复杂的 "pseudocode" loop 函数来源的一部分:

(loop for l from 0 upto (1- (array-dimension variable1 0)) do
  (if (not (aref variable1 l 0))
    (1+ max-height)
    (return)))

我有什么机会让这个 loop 更简单和优化?

Loop Documentation and the DoTimes Documentation 在我看来似乎不够清楚,无法对我的代码进行更改,对此我深表歉意。任何解释对我都很有价值。

您的原始代码可能有一些错误,因为存在语法问题,未使用正确数量的参数调用数组维度等,但您的循环很容易变成 dotimes。它会是这样的(但请注意,您需要检查是否要引用数组或对象):

(dotimes (i (array-dimension array 0))  ; array here
  (unless (aref object i 0)             ; but object here?
    (decf max-height)))

根据问题的更新,我想我们可以稍微改进一下。从代码中,我们可以看出您希望有一个(广义)布尔值的二维数组,并且您正在尝试计算第一列中的真实元素。看板可能是这样的:

(defparameter *board* #2A((nil t nil)
                          (t t t)
                          (t t t)))

注意第一行有一个个真值,第一列有两个个真值。现在,您可以编写一个 dotimes 循环来计算第一列中真实值的数量,如下所示:

(let ((max-height 0))
  (dotimes (i (array-dimension *board* 0) max-height)
    (when (aref *board* i 0)
      (incf max-height))))
;=> 2

但是,我认为 loop 如果您利用它的一些功能,实际上在这里更干净。您可以使用 below 而不是 upto,并且 from 默认为 0,所以可以省略。可以使用count来统计真值,然后默认返回count的值:

(loop for i below (array-dimension *board* 0)
   count (aref *board* i 0))
;=> 2