2013-01-09 47 views
2

返回的值有反正我可以從一個循環返回一個值,因爲遞歸必須是在尾部從一個循環

(ns for) 

    (defn abc [y] 
    (loop [x 10] 
     (when (> x 2) 
     (if (= 2 3) (do (println "test") (recur (- x 2))) 
     (do (let [x (+ 1 x) 
        y 2] (println y) (recur (- x 2)))))))) 

    (abc 1) 

有反正我可以通過取y,以便函數返回一個值作爲參數並更新y的新值。但是,重複部分必須位於代碼的最後一行,因此我無法將y作爲代碼的最後一行。

(ns for) 

    (defn abc [y] 
    (loop [x 10] 
     (when (> x 2) 
     (if (= 2 3) (do (println "test") (recur (- x 2))) 
     (do (let [x (+ 1 x) 
        y 2] (println y) (recur (- x 2))))))) 
    y) 

    (abc 1) 

因爲RECUR必須的代碼的最後一行這就給我一個錯誤。我已經看過類似的問題,並說把返回值的,如果循環,我試過的結束,但失敗了,給了我一個異常thatthe遞歸只能發生在尾部

+0

可能重複(http://stackoverflow.com/questions/14227972/returning- a值從 - 一個環) – sloth

回答

9

我猜你的意思是這樣的:

(defn abc [y] 
    (loop [x 10 
      y nil] 
     (if (> x 2) 
     (if (= 2 3) 
      (do (println "test") 
       (recur (- x 2) nil)) 
      (do (let [x (+ 1 x) 
        y 2] 
       (println y) 
       (recur (- x 2) y)))) 
     y))) 

更新。沒有不必要的部分將是

(defn abc [y] 
    (loop [x 10] 
     (if (> x 2) 
     (do (println 2) 
      (recur (- x 1))) 
     2))) 

這是相同的[從一個循環返回的值]的

(defn abc [_] 
    (dotimes [_ 8] (println 2)) 
    2)