Lisp 复杂循环优化
我有一个函数,它接受一个状态和一个动作,并返回一个新的状态,该状态是在原始状态下应用收到的动作的结果 我的问题是,我确实编写了一个复杂的Lisp 复杂循环优化,lisp,common-lisp,Lisp,Common Lisp,我有一个函数,它接受一个状态和一个动作,并返回一个新的状态,该状态是在原始状态下应用收到的动作的结果 我的问题是,我确实编写了一个复杂的循环,我想对其进行优化,这样它将为我带来一个更清晰的函数来读取和优化 我有一个复杂的“伪代码”循环函数源的一部分: (loop for l from 0 upto (1- (array-dimension variable1 0)) do (if (not (aref variable1 l 0)) (1+ max-height) (retu
循环
,我想对其进行优化,这样它将为我带来一个更清晰的函数来读取和优化
我有一个复杂的“伪代码”循环
函数源的一部分:
(loop for l from 0 upto (1- (array-dimension variable1 0)) do
(if (not (aref variable1 l 0))
(1+ max-height)
(return)))
我有什么机会使这个循环更加简单和优化
对我来说,和似乎不够清楚,无法对我的代码进行更改,对此我表示抱歉。任何解释对我来说都是有价值的。您的原始代码可能有一些错误,因为存在语法问题,数组维度没有使用正确数量的参数调用,等等,但是您的循环很容易变成dotimes。可能是这样的(但请注意,您需要检查是否要引用数组或对象):
基于对问题的更新,我认为我们可以对此进行一些改进。从代码中,我们可以看出您希望有一个(广义)布尔的二维数组,并且您试图在第一列中计算真正的元素。下面是这样一个董事会的样子:
(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
然而,我认为如果你利用它的一些特性,循环实际上更干净。您可以在下方使用,而不是在上方使用,from默认为0,因此您可以忽略它。您可以使用count对真值进行计数,然后默认返回计数值:
(loop for i below (array-dimension *board* 0)
count (aref *board* i 0))
;=> 2
您的原始代码可能有一些错误,因为存在语法问题,没有使用正确数量的参数调用数组维度,等等,但是您的循环很容易变成dotimes。可能是这样的(但请注意,您需要检查是否要引用数组或对象):
基于对问题的更新,我认为我们可以对此进行一些改进。从代码中,我们可以看出您希望有一个(广义)布尔的二维数组,并且您试图在第一列中计算真正的元素。下面是这样一个董事会的样子:
(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
然而,我认为如果你利用它的一些特性,循环实际上更干净。您可以在下方使用,而不是在上方使用,from默认为0,因此您可以忽略它。您可以使用count对真值进行计数,然后默认返回计数值:
(loop for i below (array-dimension *board* 0)
count (aref *board* i 0))
;=> 2
我打赌那个片段根本就不起作用。它到底应该做什么?循环应该从俄罗斯方块游戏中画出一条线来递减,这样当对象在第一列中有NIL
元素时,对象就会下降。decf应该修改一个位置。我不确定数组维度是否是您应该尝试修改的位置。函数1-可能就是您在那里寻找的。代码段有多个错误。这毫无意义。@JoshuaTaylor你是对的,代码是一个不干净和错误的例子。我做了我的改变,谢谢。我打赌那个片段根本不起作用。它到底应该做什么?循环应该从俄罗斯方块游戏中画出一条线来递减,这样当对象在第一列中有NIL
元素时,对象就会下降。decf应该修改一个位置。我不确定数组维度是否是您应该尝试修改的位置。函数1-可能就是您在那里寻找的。代码段有多个错误。这毫无意义。@JoshuaTaylor你是对的,代码是一个不干净和错误的例子。我做了修改,谢谢。我已经更新了我的示例@JoshuaTaylor,正如你所看到的,更加清晰,代码正确。如果你愿意,你可以用那种方式改变你的。谢谢。@franciscomariacalis查看我的编辑。我认为使用loop比使用dotime更简洁,但我已经为这两种方法提供了更新解决方案。太棒了!谢谢你@JoshuaTaylor。但是,您所说的“数组维度没有使用正确数量的参数调用”,其形式已经正确了。@FranciscoMariaCalisto我不确定您最后的评论是什么意思。我发布的更新中的代码运行并生成我显示的输出。数组维度需要两个参数:数组和你想要的维度所在的轴。@FranciscoMariaCalisto是的,现在需要了,但答案中我说使用错误数量的参数调用它的部分基于你发布的原始代码,其中包括(数组维度0)
,有错误数量的论点。一般来说,更改问题中的代码不是一个好主意,因为(正如我们所看到的)它会使原始版本中解决问题的答案无效,并使评论讨论变得混乱。这也使得这个问题更难回答,因为它成了一个移动的目标。我已经更新了我的示例@JoshuaTaylor,正如你所看到的,以更清晰和正确的代码。如果你愿意,你可以用那种方式改变你的。谢谢。@franciscomariacalis查看我的编辑。我认为使用loop比使用dotime更简洁,但我已经为这两种方法提供了更新解决方案。太棒了!谢谢你@JoshuaTaylor。但是,您所说的“数组维度没有使用正确数量的参数进行调用”已经在ri上