复杂循环优化
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
我有一个函数,它接受一个状态和一个动作,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