Clojure按顺序将前n个元素乘以' x'非递归的

时间:2014-09-11 03:01:54

标签: loops clojure non-recursive

我是clojure的新手并且遇到了一个问题,它说,将序列中的前n个元素乘以某个数字'x'(非递归)。例如,

 (multiply-n-by-x [1 2 3 4 5] 2 10) => [10 20 30 4 5]

所以在这里我明白我需要循环序列n次然后停止,但我无法做到这一点。如果有人可以指导我如何处理它,那就太好了。

4 个答案:

答案 0 :(得分:1)

我认为简单的方法是:

(defn multiply-n-by-x [seq n m]
    (concat (map #(* m %) (take (inc n) seq)) (drop (inc n) seq) )
    )

答案 1 :(得分:1)

这样做你想要的:

(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宏中返回什么内容都会被放入一个序列中,所以最终的结果是收集。

答案 2 :(得分:1)

与Shawn的答案相同,但是有了解构和split-at(稍微多余一些):

(defn multiply-n-by-x [s n x]
  (let [[s1 s2] (split-at (inc n) s)]
    (concat (map #(* x %) s1) s2)))

答案 3 :(得分:0)

延迟序列捕获延迟递归。 takedropsplitfor是惰性结构。我们可以通过急切地计算序列的改变头来避免它们,如下所示:

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