【发布时间】:2013-11-03 05:47:45
【问题描述】:
iterate 的大多数引用都是针对运算符的,所有函数上的应用程序都非常混乱,以至于我仍然不知道如何在我的代码中使用 iterate,以及 partial 是什么。
我正在做一个编程作业,尝试使用牛顿法求数字 n 的平方根。也就是说,以猜测作为初始近似值,通过计算近似值和 n/近似值的平均值来继续计算新的近似值。继续,直到两个最近的近似值之间的差异小于 epsilon。
我试图先做近似部分,我相信这是我需要使用迭代和部分的东西。后来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)。
我想这是我需要一遍又一遍地迭代的部分?有人可以给我一些提示吗?同样,这是一个家庭作业问题,所以请不要为我提供整个问题的直接解决方案,我需要一些可以学习的想法和解释。
【问题讨论】:
-
什么是
operator?我认为clojure中没有任何称为运算符的东西。像+或-或*或/这样的东西在另一种语言中将是一个运算符,它们只是clojure 中的函数。您可以使用任何其他可以使用它们的函数(只要它采用相同的参数)。 -
大家好,非常感谢你们的帮助!我把一切都弄清楚了。由于这是尚未完成的作业,我认为我不能发布我的代码。
标签: clojure functional-programming square-root