2017-04-27 157 views
0

我寫了這個「碼」,顯示問題,因爲實際的代碼是相當大的避免使用全局變量在這種情況下

(defn add-list 
    ([number] 

    (def used [number]) 
    (add-list number used)) 

    ([number used] 

    ;Add elements to used 
    ;Process the elements in used 
    ;Find the next number 

    (add-list number used) 
    )) 

我需要,我可以在FN訪問向量將允許我處理矢量內的項目,然後將輸出添加到矢量,以便舊項目和新項目在此矢量中進行下一個循環。

我通過定義添加列表函數上方的矢量得到了它的工作,但是如果我第二次在repl上運行該程序,矢量不會被清除。它還表示這個矢量有時不受限制。

+0

您需要更具體地瞭解代碼需要做什麼。您可能還希望查看用於累積結果的'reduce'函數:https://clojuredocs.org/clojure.core/reduce –

+0

我不添加數字我只是試圖將一個項目向量傳遞到此循環中將根據當前內容添加到矢量中。 – MDubzem

+0

我一直在使用上述風格不可靠地工作,但我得到這樣的錯誤:IllegalArgumentException不知道如何創建ISeq:clojure.lang.Var $ Unbound – MDubzem

回答

1

reduce功能可以用來累積結果列表,而不僅僅是值求和:

(defn accum-reverse 
    [cum-state curr-val] 
    (cons curr-val cum-state)) 

(println 
    (reduce accum-reverse 
    []    ; initial value of cum-state 
    [1 2 3 4 5]  ; fed into curr-val one at a time 
)) 

;=> (5 4 3 2 1) 

功能accum-reverse被稱爲5倍。第一次cum-state[]的初始值,即空向量。隨後的每個時間cum-state都設置爲從accum-reverse開始的返回值。

除了在線文檔,您還可以從Clojure for the Brave & True得到一些很好的信息。它大部分是在線的,但它也值得購買。

+0

謝謝。我目前遇到的問題是我試圖從循環中更新向量中的數據,但循環沒有在下面的循環中獲取更新後的數據只有初始數據。我知道我正在更新它,向量是在循環外部定義的 – MDubzem

+0

我似乎找不到一種方法來給每個遞歸循環提供最新數據 – MDubzem

+0

也許值得注意的是'accum-reverse'很像'conj',如果使用'()'作爲初始值而不是'[]'。 – amalloy