3

ベクトルの入力 要素間の連続した差を与える関数を書きたいと思います。理想的には、関数はベクトル x と n 番目の差分を指定するパラメーター n を入力する必要があります。

[xn] 形式のサンプル

入力 1: [16 10 8 6 4 2] 1 (最初の差分に 1)

出力 1: [-6 -2 -2 -2 -2]

入力 2: [16 10 8 6 4 2] 2

出力 2: [4 0 0 0 nil nil]

サンプル 2 で何が起こっているかを象徴的に示します (Clojure コードではなく、アイデアの説明を目的としています)。

[abcdef] 2

[a-2b+c、b-2c+d、c-2d+e、d-2e+f]

4

2 に答える 2

6

どうぞ:

(def a [16 10 8 6 4 2])

(defn diff [a] 
  (map - (rest a) a))

(defn diff-n [a n]
  (nth (iterate diff a) n))

(diff-n a 1) ; => (-6 -2 -2 -2 -2)
(diff-n a 2) ; => (4 0 0 0)
于 2013-11-20T23:21:41.123 に答える
1

@Shlomi の回答と同じですが、オプションのステップ サイズ パラメータがあります。

(defn diff
  ([a]
    (map - (next a) a))
  ([a step]
    (map - (nthnext a step) a)))

(defn nthdiff
  ([a n]
    (nth (iterate diff a) n))
  ([a n step]
    (nth (iterate #(diff % step) a) n)))
于 2013-11-29T01:50:19.753 に答える