例如,要在某个点上计算多项式,我必须循环遍历它的系数ai ∈ a0..an,用参数幂i相乘,然后把它全部加起来。(我知道Horner的方法,只是想不出更好的例子)当然,我可以用一些生成的序列计算压缩系数,并以某种方式遍历这些对:
(loop for (ai, i)
in (apply #'list a (loop for i from 0 below (length a) collect i))
sum (* ai (expt x i)))但这似乎很麻烦。有办法把它合并成一个循环吗?
编辑:mapcar,而不是apply。
发布于 2013-08-20 07:02:33
首先是关于你的代码。当使用列表时,您需要知道一些事情。
APPLY是错误的,但是不要在列表操作中使用它。APPLY只允许有限数量的参数--就像公共Lisp中的任何函数一样。因此,APPLY被认为不执行列表操作或调用列表操作。它用于调用函数,其参数为list。如果将其用于正常的列表处理任务,任何足够长的列表都会触发错误。LENGTH。要计算列表的长度,必须遍历列表。为了迭代的目的,对列表进行映射或迭代就足够了。它将在最后终止。在许多情况下,迭代不需要知道某个列表的长度。如果您想循环两种不同的方式,只需将其写在LOOP中作为两个变量。
(loop for ai in coefficients and i from 0
sum (* ai (expt x i)))以上循环终止,因为ai只设置为系数的元素。然后i就会数数。and意味着变量并行执行。您可以将and替换为for,然后根据第一个变量计算第二个变量。类似于LET和LET*。
https://stackoverflow.com/questions/18328480
复制相似问题