2017-03-31 93 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,或者你想達到的目的,以獲得更好的答案。