clojure - 迷失在括号中(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)
解决方案
这是一个例子:
(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))
但是这段代码显然更长。另一方面,它更好地显示了数学上正在发生的事情,并且在这个意义上可以说更具可读性。
推荐阅读
- c# - 在 ASP.NET-Core 服务中重用 MongoDB MongoClient
- swift - swift:如何在 Observableobject 中调用函数
- java - 使用 fillRect() 的正确方法是什么?
- r - 使用 R 的季度雅虎财务数据
- python - python COVID-19 SIRD 模型 ODE symfit 不起作用
- javascript - 在 JavaScript 中,有没有办法制作一个按钮/文本字段组合,该组合将在文本字段的内容中附加一个空白段落
- reactjs - React Toastify - Not getting error notification
- app-store-connect - AppStore Connect - 无法为试飞构建提供信息
- mysql - SELECT中的Mysql SELECT
- lua - 使用 load() 将字符串用作函数时。它返回“尝试调用零值”