1

例如,要在某个点计算多项式,我必须遍历它的 coefficients ai ∈ a0..an,将每个乘以自变量幂i并将其全部相加。(我知道霍纳的方法,只是想不出更好的例子)当然我可以用一些生成的序列压缩系数,并以某种方式遍历这些对:

(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

4

1 回答 1

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意味着变量是并行的。您可以替换andfor,然后可以根据第一个变量计算第二个变量。类似于LETvs. LET*_

于 2013-08-20T07:02:33.167 回答