我是 clojure 的新手,遇到了一个问题,即将序列中的前 n 个元素乘以某个数字“x”(非递归)。所以例如
(multiply-n-by-x [1 2 3 4 5] 2 10) => [10 20 30 4 5]
所以在这里我明白我需要循环序列 n 次然后停止,但我无法做到这一点。如果有人可以指导我如何处理它,那就太好了。
我是 clojure 的新手,遇到了一个问题,即将序列中的前 n 个元素乘以某个数字“x”(非递归)。所以例如
(multiply-n-by-x [1 2 3 4 5] 2 10) => [10 20 30 4 5]
所以在这里我明白我需要循环序列 n 次然后停止,但我无法做到这一点。如果有人可以指导我如何处理它,那就太好了。
我认为简单的方法是:
(defn multiply-n-by-x [seq n m]
(concat (map #(* m %) (take (inc n) seq)) (drop (inc n) seq) )
)
这可以满足您的要求:
(defn multiply-n-by-x [sq n x]
(for [i (range (count sq)) ;for i in range 0 to number of elements in sq
:let [element (nth sq i)]] ;bind element to the nth item in sq
(if (<= i n) ;if index below n, return the multiplied element, otherwise return the element as is
(* x element)
element)))
无论您在 for 宏中返回什么,都将被放入一个序列中,因此最终结果是集合。
与肖恩的回答相同,但具有解构和split-at
(少一点冗余):
(defn multiply-n-by-x [s n x]
(let [[s1 s2] (split-at (inc n) s)]
(concat (map #(* x %) s1) s2)))
惰性序列捕获延迟递归。take
, drop
,split
和for
是惰性结构。我们可以通过急切地计算改变的序列头来避免它们,如下所示:
(defn multiply-n-by-x [coll n x]
(loop [head [], coll coll, n n]
(if (and (seq coll) (>= n 0))
(recur (conj head (* (first coll) x)) (rest coll) (dec n))
(concat head coll))))
例如,
(multiply-n-by-x [1 2 3 4 5] 2 10)
;(10 20 30 4 5)
顺便说一句,Clojure 中的约定是给出切片的计数,而不是最终元素的索引,后者少一。
(range 3)
;(0 1 2)