Clojure conj不更新循环内的向量
我在努力自学clojure。这应该是一个简单的函数,它接受一个值并将其前面的每个值相加,然后返回这些值的总和 问题是,在Clojure conj不更新循环内的向量,clojure,Clojure,我在努力自学clojure。这应该是一个简单的函数,它接受一个值并将其前面的每个值相加,然后返回这些值的总和 问题是,在循环函数中,数字没有像我预期的那样用conj修改-数字只是保持一个空向量。为什么呢 (defn sum [number] (do (def numbers (vector)) (loop [iteration number] (if (&
循环
函数中,数字
没有像我预期的那样用conj
修改-数字
只是保持一个空向量。为什么呢
(defn sum
[number]
(do (def numbers (vector))
(loop [iteration number]
(if (> iteration 0)
(conj numbers iteration)
(recur (dec iteration))))
(map + numbers)))
一些提示(不是答案):
- 不要使用
李>do
- 在函数中使用
,而不是let
def
- 使用由
返回的结果,否则它什么也不做conj
- 将结果通过
返回李>recur
sum
函数忽略其number
参数
我想你正在混淆数字
(你想添加的东西的数量)和数字
(东西本身)。记住
- 向量(和其他数据结构)知道它们的长度;及
- 正如下文所述,它们通常被迅速而简洁地处理为
序列,使用
和first
代替索引rest
您正在搜索的代码模式非常常见,已在名为
reduce
的标准高阶函数中捕获。你可以通过……得到你想要的效果
(defn sum [coll] (reduce + coll))
或
比如说,
(sum (range 10))
;45
有些离题:
如果我是你,我曾经是,我会在网上阅读一些优秀的clojure教程,并附上回复。你可以开始找或者。享受吧 您的功能不起作用主要有三个原因:
- 您假设conj将更新变量
的值(但实际上它返回绑定到另一个名称的副本)numbers
- 您使用了类似于经典命令式风格的
模式(它的工作原理不同)loop/recur
map的错误使用
(defn sum
[number]
(loop [iteration number
numbers []]
(if (<= iteration 0)
(reduce + numbers)
(recur (dec iteration) (conj numbers iteration)))))
(定义和
[数字]
(循环[迭代次数
数字[]]
(如果(conj
没有修改它的参数,它将返回一个添加了元素的新向量。啊,我明白了,那么我需要重新思考我是如何做到这一点的。谢谢。这有助于向我清楚地解释循环/重现。谢谢。感谢链接。我要查看它们!
(defn sum
[number]
(loop [iteration number
numbers []]
(if (<= iteration 0)
(reduce + numbers)
(recur (dec iteration) (conj numbers iteration)))))