gpt4 book ai didi

clojure - 这是可怜的clojure吗?

转载 作者:行者123 更新时间:2023-12-04 18:34:19 25 4
gpt4 key购买 nike

我有以下结构的数据(简化):

(def m {"a" [1 2 3] "b" [4 5 6] "c" [7 8 9] "d" [10 11 12]})

我有一个递归函数,在任何迭代中我都对每个 abc 的第 i 个元素感兴趣和 d

我一直在做的是:

(loop [i 0]
(let [a ((m "a") i)
b ((m "b") i)
c ((m "c") i)
d ((m "d") i)]
...do stuff with a, b, c and d...

换句话说,我正在为 abcd 创建绑定(bind),这是因为每次我需要此值时,我都不想在我的代码中多次重复类似 ((m "a") i) 的内容。

这看起来有点笨拙,而且不是一种非常实用的风格。有没有更好的方法来实现这一目标?也就是说,是创建绑定(bind)的更优雅的方式还是避免绑定(bind)的方式?

编辑:添加关于为什么我需要循环而不是映射的解释:

我的数据代表一棵树,我的函数遍历树以找到合适的终端节点。每个向量的 i'th 元素是与 i'th 节点相关的数据。因此,我从 i = 0 开始,因为这是根节点。我做了一些逻辑,这告诉我下一步要去哪个节点。每个节点的逻辑都相同,这就是我使用 looprecur 的原因。实际上可能有 200 个节点,因此通过树的一条路径可能是 0 > 6 > 45 > 67 > 123 > 130 > 156 > done

如果有一种方法可以使用 map 而不是 loop 来遍历树,我会印象深刻。

最佳答案

根据您要解决的更大问题,这可能会有所帮助:

user> (def m {"a" [1 2 3] "b" [4 5 6] "c" [7 8 9] "d" [10 11 12]})
#'user/m
user> (defn each-element [a b c d] (vector a b c d))
#'user/each-element
user> (apply map each-element (map m ["a" "b" "c" "d"]))
([1 4 7 10] [2 5 8 11] [3 6 9 12])

您可以将 each-element 的定义替换为您的函数,该函数分别操作“a”、“b”、“c”和“d”中的一个元素。

关于clojure - 这是可怜的clojure吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22919367/

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