例如,要在某个点计算多项式,我必须遍历其系数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
。
答案 0 :(得分:7)
首先介绍一下你的代码。使用列表时,您需要了解一些事项。
APPLY
无论如何都是错误的,但不要将它与列表操作一起使用。 APPLY
只允许有限数量的参数 - 就像Common Lisp中的任何函数一样。因此,APPLY
不被认为是列表操作或调用列表操作。它用于以列表作为参数调用函数。如果将它与正常的列表处理任务一起使用,任何足够长的列表都会触发错误。
应避免在列表中调用LENGTH
。要计算列表的长度,必须遍历列表。出于迭代目的,映射或迭代列表就足够了。然后它将在结束时终止。在许多情况下,迭代不必知道某个列表的长度。
如果你想以两种不同的方式循环,只需将它作为两个变量写在LOOP
中。
(loop for ai in coefficients and i from 0
sum (* ai (expt x i)))
上面的循环终止,因为ai
仅设置为系数的元素。 i
然后才算数。 and
表示变量单步执行 parallel 。您可以将and
替换为for
,然后可以根据第一个变量计算第二个变量。与LET
vs相似LET*
。