如何在Common Lisp中遍历列表和范围?

时间:2013-08-20 06:37:18

标签: loops common-lisp

例如,要在某个点计算多项式,我必须遍历其系数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

1 个答案:

答案 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*