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

aka*_*nuk 1 loops common-lisp

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

Rai*_*wig 7

首先是你的代码.使用列表时,您需要了解一些事情.

  • 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意味着变量并行执行.您可以替换andfor,然后可以根据第一个变量计算第二个变量.与LETvs. 相似LET*.