【发布时间】:2014-12-25 00:06:54
【问题描述】:
我正在尝试更多地了解 Clojre,因此我决定在其中进行我的 Runge Kutta 集成器项目。但是,我在处理 let 语句的不可变性质时遇到了问题。我想在循环的每次迭代中评估 8 个变量,并使用它们来递归它,直到我的循环完成。
按照我的理解,由于我的 recur 在 let 的范围内,我的 k 和 l 不会被每次递归覆盖。我正在寻找一种更惯用的方式来通过我的积分器进行递归。
(loop [psin 0 Xin 1 xn dx] ;initial values
(if (> xn 1)
psin
(let [k1 (evalg xn psin) ;define 4 variables to calculate next step of Xi, psi
l1 (evalf xn Xin) ;evalf and evalg evaluate the functions as per Runge Kutta
k2 (evalg (+ (* 0.5 dx) xn) (+ (* 0.5 l1) psin))
l2 (evalf (+ (* 0.5 dx) xn) (+ (* 0.5 k1) Xin))
k3 (evalg (+ (* 0.5 dx) xn) (+ (* 0.5 l2) psin))
l3 (evalf (+ (* 0.5 dx) xn) (+ (* 0.5 k2) Xin))
k4 (evalg (+ dx xn) (+ l3 psin))
l4 (evalf (+ dx xn) (+ k3 Xin))]
(do
(let [Xinew (+ Xin (* (/ dx 6) (+ k1 k4 (* 2 k3) (* 2 k2))) )
psinew (+ psin (* (/ dx 6) (+ l1 l4 (* 2 l2) (* 2 l3) )))]
(println k1)
(recur psinew Xinew (+ dx xn)))))))
非常感谢!期待更多地了解clojure:)
【问题讨论】:
-
我认为您的理解不正确 -
let绑定将在每次循环迭代时重新评估。你试过了吗?
标签: recursion clojure immutability let