请评论如何重组以下函数,使其更具可读性和更少的括号。
(defn forwardDifference2nd [fn x h]
(->
(/ (+ (-
(fn (+ (+ x h) h))
(* (fn (+ x h)) 2.0))
(fn x))
(Math/pow h 2))))
Run Code Online (Sandbox Code Playgroud)
源代码
(def x 1.0)
(def h 0.1)
(defn forwardDifference2nd [fn x h]
(->
(/ (+ (-
(fn (+ (+ x h) h))
(* (fn (+ x h)) 2.0))
(fn x))
(Math/pow h 2))))
(defn myPolynomial [x]
(->
(+ (* 2
(Math/pow x 3))
(* 4
(Math/pow x 2)))
(- (* 5 x))))
(forwardDifference2nd myPolynomial x h)
Run Code Online (Sandbox Code Playgroud)
这是一个例子:
(defn forwardDifference2nd [f x h]
(let [fh #(f (+ x (* h %)))]
(/ (+ (fh 2) (* -2 (fh 1)) (f x))
h h)))
Run Code Online (Sandbox Code Playgroud)
简化:
(-> ...)
(/ ... (Math/pow h 2))
为(/ ... h h)
更新:
您的计算可以更一般地表示为
(defn difference-at-depth [f x h depth]
(if (zero? depth)
(f x)
(let [depth (dec depth)]
(/ (- (difference-at-depth f (+ x h) h depth)
(difference-at-depth f x h depth))
h))))
(defn forwardDifference2nd [f x h]
(difference-at-depth f x h 2))
Run Code Online (Sandbox Code Playgroud)
但这段代码显然更长。另一方面,它更好地显示了数学上正在发生的事情,并且在这个意义上可以说更具可读性。