从循环返回值

时间:2013-01-09 03:50:36

标签: clojure

无论如何我可以从循环返回一个值,因为递归必须在尾部

(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的新值来返回函数的值。但是,recur部分必须位于代码的最后一行,因此我无法将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必须是最后一行代码。我已经查看了类似的问题,它说将返回值放在if循环的末尾,我试过但失败了,这给了我一个例外,递归只能发生在尾部

1 个答案:

答案 0 :(得分: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)