gpt4 book ai didi

Clojure:对于 n 个维度

转载 作者:行者123 更新时间:2023-12-05 00:19:28 25 4
gpt4 key购买 nike

在 Clojure 中,函数 for可用于迭代嵌套序列。想象一个具有 x、y 和 z 轴的 3D 空间:

(for [x (range 10)
y (range 5)
z (range 2)]
[x y z])

上面的代码将产生一个向量序列,代表长方体内所有可能的位置。 (当然限于索引为自然数的位置)

有没有人知道使这更通用的好方法?意思是,如果您没有 3 维数而是 n 维数,则使其工作。

最佳答案

Most approaches好像用for ,就像您所做的那样,假设已知数量的维度。您似乎正在寻找的是 cartesian product . clojure.math.combinatorics中有计算笛卡尔积的函数.

(cartesian-product (range 10) (range 5) (range 2))
(apply cartesian-product (map range [10 5 2]))
(apply cartesian-product (repeatedly n #(range 3)))

如果您不想包含另一个库, this question有一些有趣的答案,您可以使用和/或从中学习。

截至 2016 年 3 月,这是 clojure.math.combinatorics/cartesian-product 的来源:
(defn cartesian-product
"All the ways to take one item from each sequence"
[& seqs]
(let [v-original-seqs (vec seqs)
step
(fn step [v-seqs]
(let [increment
(fn [v-seqs]
(loop [i (dec (count v-seqs)), v-seqs v-seqs]
(if (= i -1) nil
(if-let [rst (next (v-seqs i))]
(assoc v-seqs i rst)
(recur (dec i) (assoc v-seqs i (v-original-seqs i)))))))]
(when v-seqs
(cons (map first v-seqs)
(lazy-seq (step (increment v-seqs)))))))]
(when (every? seq seqs)
(lazy-seq (step v-original-seqs)))))

关于Clojure:对于 n 个维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35874072/

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