gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:29:13 25 4
gpt4 key购买 nike

我正在尝试生成一个相对较小(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]

目前我拥有的是:

(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]))))

这可行,但最终会破坏堆栈。

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

最佳答案

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

(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]

广义:

(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))

关于clojure - 为什么我在没有显式递归的函数上收到 StackoverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31501530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com