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 回答