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 はコードの最後の行でなければならないため、これはエラーになります。同様の質問を見てきましたが、試行したが失敗した if ループの最後に戻り値を配置するように指示されているため、再帰は末尾でのみ発生するという例外が発生します

4

1 に答える 1

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)
于 2013-01-09T04:02:21.023 に答える