私は 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 [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 マクロ内で返すものはすべてシーケンスに入れられるため、最終結果はコレクションになります。
簡単な方法は次のとおりだと思います:
(defn multiply-n-by-x [seq n m]
(concat (map #(* m %) (take (inc n) seq)) (drop (inc n) seq) )
)
ショーンの答えと同じですが、破壊と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 の規則では、1 つ少ない最終要素のインデックスではなく、スライスのカウントを指定します。
(range 3)
;(0 1 2)