2017-03-31 72 views
0
(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。我已经调查:Lisp:如何获得最终循环值?

  • collect但返回与我想要的值(最后j末)
  • finally值的列表,但没有奏效。
  • return,但它结束循环早期
+0

如果'collect'最后有你的答案,难道你不能只返回最后一个值吗? – Carcigenicate

+0

如何最终一起使用回报? –

+0

您可以使用第二个'setf'来记住'j'的值。或者你可以用递归函数替换循环。 – SpiderPig

回答

3

您需要结合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条款。

+0

但是这并不能给我j的最后一个值(如princ所见),它给了我更大的价值。 – swissnetizen

+0

@swissnetizen:哎呀,对不起,修好了。 – sds

1

好像你可能希望这样的事情,但我不确定:

(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)))) 

有几件事情,使这种气味类似的off-by-之一:to<=,并在问题编码x在第一次迭代期间始终为0(n = 0时会发生什么?)。也许会展示更多的上下文,例如, G。 max-index-for-iteration,或者你想达到的目的,以获得更好的答案。