Я пытаюсь познакомиться с Clojre, поэтому я решил сделать в нем проект интегратора Runge Kutta. Однако у меня возникают проблемы с неизменным характером заявления let. Я хочу оценивать 8 переменных на каждой итерации цикла и использовать их для повторения через нее, пока мой цикл не будет закончен.Рекурсивное переназначение переменных в Clojure
Как я понимаю, так как мой повторялся находится внутри пусть сфер «s, мой к и единицы не будет перезаписан с каждой рекурсией. Я ищу более идиоматический способ рекурсии через моего интегратора.
(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' будут пересмотрены на каждой итерации цикла. Вы попробовали? – Alex