iterate
的引用都是针对操作符,而所有与函数相关的应用都很令人困惑,以至于我仍然不知道如何在我的代码中使用iterate
以及什么是partial
。我正在完成一个编程作业,尝试使用牛顿法来获取数字n的平方根。也就是说,从猜测为初始近似值开始,通过计算近似值和n/近似值的平均值来计算新的近似值。继续计算,直到最近的两个近似值之间的差异小于epsilon。
我现在正在尝试先完成近似值部分,我相信这是我需要使用
iterate
和partial
的内容。然后,epsilon是我需要使用“take”的东西吗?这是我目前用于近似值的代码(未包含epsilon):
(defn sqrt [n guess]
(iterate (partial sqrt n) (/ (+ n (/ n guess)) 2)))
这段代码存在一些问题,当我输入(sqrt 2 2)
时,它会给我一个错误:(3/2 user=> ClassCastException clojure.lang.Cons cannot be cast to java.lang.Number clojure.lang.Numbers.divide (Numbers.java:155)
。
我猜这是需要反复迭代的部分?请问有人能给我一些提示吗?再次强调,这是一道作业题,所以请不要直接提供整个问题的解决方案,我需要一些可以从中学习的思路和解释。
+
、-
、*
或/
这样的东西会被称为运算符,但在Clojure中它们只是函数。你可以在任何需要它们的地方使用任何其他函数(只要它们接受相同的参数)。 - noisesmith