【问题标题】:Lisp: How to obtain the final loop value?Lisp:如何获得最终的循环值?
【发布时间】:2017-03-31 19:15:48
【问题描述】:
(defun index-iteration (n) 
  (let ((x 0))
    (loop for j from 0 to n while (< x n) do
      (setf x (max-index-for-iteration j)))))

我有以下 lisp 代码,在循环结束时我想返回值j。我调查过:

  • collect 但这会返回一个包含我想要的值的值列表(最后一个 j 在末尾)
  • finally 但没用。
  • return 但它提前结束了循环

【问题讨论】:

  • 如果collect最后有你的答案,你不能只返回最后一个值吗?
  • finally和return一起使用怎么样?
  • 您可以使用第二个setf 来记住j 的值。或者你可以用递归函数替换循环。
  • @spiderPig 我已经这样做了,但我想要更简洁的代码。

标签: lisp common-lisp clisp


【解决方案1】:

您需要像这样组合 finallyreturn

(loop ...
  finally (return (1- j)))

请注意不幸的使用 1- 这是由于 事实上,finally 子句是在 终止之后执行的 子句(在您的情况下为while)将控制权转移到那里。 IOW,它需要有关如何处理终止子句的知识。

您可以留在loop 域中(没有额外的let),例如 这个:

(loop for j from 0 to n
  for ret = j
  do ...
  finally (return ret))

您也可以使用maximize 子句:

(loop for j from 0 to n ...
  maximize j)

但这依赖于 j 的最终值是最大值这一知识。

PS。另请注意,您的loop 中不需要while 子句。

【讨论】:

  • 但这并没有给我 j 的最后一个值(如 princ 所示),它给了我一个更大的值。
  • @swissnetizen:哎呀,抱歉,已修复。
【解决方案2】:

看起来你可能想要这样的东西,但我不确定:

(defun index-iteration (n)
  (loop :for j :from 0 :to n
        :for x := (max-index-for-iteration j)
        :while (<= x n)
        :finally (return (1- j))))

有几件事使这种气味像一个接一个:to&lt;=,以及在您的问题代码中x 在第一次迭代期间始终为 0 的事实(应该发生什么对于 n = 0?)。也许显示更多的上下文,例如。 G。 max-index-for-iteration,或您想要达到的目标,以获得更好的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多