例如,要在某个点计算多项式,我必须遍历其系数ai ? a0..an
,将每个乘以参数幂i
并将其求和.(我知道Horner的方法,只是无法提出更好的例子)当然我可以使用一些生成的序列的zip系数,并以某种方式通过这些对:
(loop for (ai, i)
in (apply #'list a (loop for i from 0 below (length a) collect i))
sum (* ai (expt x i)))
Run Code Online (Sandbox Code Playgroud)
但这似乎很麻烦.有没有办法将它组合在一个循环中?
编辑:mapcar
不是apply
.
首先是你的代码.使用列表时,您需要了解一些事情.
APPLY
无论如何都是错误的,但不要将它与列表操作一起使用.APPLY
只允许有限数量的参数 - 就像Common Lisp中的任何函数一样.因此APPLY
不被认为是列表操作或调用列表操作.它用于以列表作为参数调用函数.如果将它与正常的列表处理任务一起使用,任何足够长的列表都会触发错误.
LENGTH
应该避免呼叫列表.要计算列表的长度,必须遍历列表.出于迭代目的,映射或迭代列表就足够了.然后它将在结束时终止.在许多情况下,迭代不必知道某个列表的长度.
如果你想循环两种不同的方式,只需将它LOOP
作为两个变量写下来.
(loop for ai in coefficients and i from 0
sum (* ai (expt x i)))
Run Code Online (Sandbox Code Playgroud)
上面的循环终止,因为ai
只设置为系数的元素.i
然后才算数.这and
意味着变量并行执行.您可以替换and
为for
,然后可以根据第一个变量计算第二个变量.与LET
vs. 相似LET*
.