为什么我在没有显式递归的函数上得到StackoverflowError

Gar*_*owe 3 clojure

我试图生成一个相对较小的(1296个元素)向量列表,基本上枚举从[0 0 0 0]到[5 5 5 5]的4个基数6位数

[0 0 0 0], [1 0 0 0] ... [5 0 0 0], [0 1 0 0] ... [5 5 5 5]
Run Code Online (Sandbox Code Playgroud)

目前我所拥有的是:

(letfn [(next-v [v]
          (let [active-index (some (fn [[i e]] (when (> 5 e) i)) 
                                   (map-indexed vector v))]
            (map-indexed #(cond
                           (> active-index %1) 0
                           (= active-index %1) (inc %2)
                           :else %2)
                         v)))]
  (last (take 1290 (iterate next-v [0 0 0 0]))))
Run Code Online (Sandbox Code Playgroud)

这可行,但它最终会打击堆栈.

我在这做什么导致StackOverflowError?如何构建我的代码以使其"安全"?有没有更好的方法来做我想做的事情?

Mic*_*ent 5

我解决这个问题的方法是:

(def my-range
  (for [i (range 0 6)
        j (range 0 6)
        x (range 0 6)
        y (range 0 6)]
    [i j x y]))

(nth my-range 1295) ;;=> [5 5 5 5]
Run Code Online (Sandbox Code Playgroud)

广义:

(defn combine [coll]
  (for [i (range 6)
        j coll]
    (conj j i)))

(combine (map list (range 6)))
(combine (combine (map list (range 6))))
(combine (combine (combine (map list (range 6)))))

(def result (nth (iterate combine (map list (range 6))) 3))
Run Code Online (Sandbox Code Playgroud)