首页 > 解决方案 > 迷失在括号中(Clojure)

问题描述

请评论如何重组以下函数,使其更具可读性和更少的括号。

(defn forwardDifference2nd [fn x h]
  (->
   (/ (+ (-
          (fn (+ (+ x h) h))
          (* (fn (+ x h)) 2.0))
         (fn x))
      (Math/pow h 2))))

源代码

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

标签: clojure

解决方案


这是一个例子:

(defn forwardDifference2nd [f x h]
  (let [fh #(f (+ x (* h %)))]
    (/ (+ (fh 2) (* -2 (fh 1)) (f x))
       h h)))

简化:

  • 消除(-> ...)
  • 将相似的表达式分解为局部函数
  • 展平嵌套的和和差
  • 替换(/ ... (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))

但是这段代码显然更长。另一方面,它更好地显示了数学上正在发生的事情,并且在这个意义上可以说更具可读性。


推荐阅读