【问题标题】:How to return a specific value in a loop如何在循环中返回特定值
【发布时间】:2015-01-09 18:32:47
【问题描述】:

我是 LISP 的完全新手 我有 Peter Seibel 的《实用通用 Lisp》一书,但我找不到我的问题的答案。 所以基本上我如何让它返回最后一个“:do”的值

(defun averages (numbers)
 (loop :for i :in numbers :sum i :into x :do (/ x (length numbers))))

请记住,我做这件事的时间不长。 我也不太了解 Stackoverflow 的不成文的注意事项。

【问题讨论】:

    标签: loops common-lisp


    【解决方案1】:

    使用finally:

    (defun averages (numbers)
      (loop :for i :in numbers :sum i :into x
         :finally (return (/ x (length numbers)))))
    

    为了避免遍历列表两次,您可以这样做(如 @mark-reed 和 @joshua-taylor 建议的那样)

    (defun averages (numbers)
      (loop :for n :in numbers :sum n :into x :count t :into len
         :finally (return (/ x len))))
    

    但在性能方面可能不会有太大差异。

    PS。您可能需要考虑 CLOCC/CLLIB/math.lisp 来满足您的基本统计需求。

    【讨论】:

    • 此外,length 调用不必要地再次遍历列表。我会这样做:(loop :for i :in numbers :sum i :into x :sum 1 :into n :finally (return (/ x n)))
    • 把它改成"(return (/x len)) 什么是调用len函数?
    • 这不是一个函数,它是另一个变量 - 在循环中添加了一个子句,以便在每次迭代时向其添加 1(:sum 1 :into - 我使用了 n,@sds 使用了 len
    • 也不需要:sum 1 :into len;你可以:count i :into n。它可能没有太大区别,但它更清楚地表明 len 只是数字的计数,而不是(例如)平均值的权重总和。
    【解决方案2】:

    如果您不使用 LOOP 中的多个变量等高级功能,则很容易将其简化:

    (defun averages (numbers)
      (loop for i in numbers sum i into x
            finally (return (/ x (length numbers)))))
    

    利用 LOOP 表单返回总和的优势:

    (defun averages (numbers)
      (/ (loop for i in numbers sum i)
         (length numbers)))
    

    首先检查一个空的数字列表也可能很有用。

    【讨论】:

      猜你喜欢
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 2019-10-09
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多