【问题标题】:How to iterate both through list and range in Common Lisp?如何在 Common Lisp 中遍历列表和范围?
【发布时间】:2013-08-20 06:37:17
【问题描述】:

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

【问题讨论】:

    标签: loops common-lisp


    【解决方案1】:

    首先关于您的代码。使用列表时,您需要注意一些事项。

    • APPLY 无论如何都是错误的,但不要将它与列表操作一起使用。 APPLY 只允许有限数量的参数 - 就像 Common Lisp 中的任何函数一样。因此APPLY 不被认为是做列表操作或调用列表操作。它用于调用以列表为参数的函数。如果将它用于正常的列表处理任务,任何足够长的列表都会触发错误。

    • 应避免在列表上调用LENGTH。要计算列表的长度,必须遍历列表。出于迭代目的,映射或迭代列表就足够了。然后它将在最后终止。在许多情况下,迭代不需要知道某个列表的长度。

    如果您想循环两种不同的方式,只需将其写在LOOP 中作为两个变量。

    (loop for ai in coefficients and i from 0
          sum (* ai (expt x i)))
    

    上述循环终止,因为ai 仅设置为系数的元素。 i 然后开始计数。 and 表示变量并行。您可以将and 替换为for,然后可以根据第一个变量计算第二个变量。类似于LETvs。 LET*.

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2010-11-27
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      相关资源
      最近更新 更多