7

大多数参考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).

我想这是我需要一遍又一遍地迭代的部分?有人可以给我一些提示吗?同样,这是一个家庭作业问题,所以请不要为我提供整个问题的直接解决方案,我需要一些可以学习的想法和解释。

4

3 回答 3

6

partial接受一个函数和该函数的至少一个参数,并返回一个需要其余参数的新函数。

(def take-five (partial take 5))
(take-five [1 2 3 4 5 6 7 8 9 10])
;=> (1 2 3 4 5)

iterate通过采用两个参数生成一个无限序列:一个函数和一个种子值。种子值用作生成列表中的第一个元素,第二个元素通过将函数应用于种子来计算,第二个值用作函数的输入以获得第三个值,依此类推。

(take-five (iterate inc 0))
;=> (0 1 2 3 4)

ClojureDocs 提供了关于这两个函数的良好文档:http: //clojuredocs.org/clojure_core/clojure.core/iteratehttp://clojuredocs.org/clojure_core/clojure.core/partial

于 2013-11-03T08:41:30.927 回答
4

所以,@ponzao 很好地解释了做什么iteratepartial做什么,@yonki 指出你并不真正需要它。如果您想探索更多 seq 函数,无论如何尝试它可能是一个好主意(尽管惰性序列的开销可能会导致性能不太理想)。

提示:

  • (iterate #(sqrt n %) initial-approximation)会给你一个近似值。
  • 您可以使用它partition来创建成对的后续近似值。
  • 丢弃不满足 epsilon 条件的所有内容,使用drop-while
  • 得到结果。

使用序列来解决这个问题可能会非常有益,因为您接触到了许多有用的 seq 函数。

注意:此答案的编辑历史记录中有一个完整的解决方案。很抱歉,没有完全得到“作业”部分。

于 2013-11-03T11:07:45.437 回答
0

我认为你没有抓住重点。你也不iterate需要partial

如果您需要执行一些计算直到满足条件,您可以使用易于理解的loop/recur指令。loop/recur可以理解为:做一些计算,检查条件是否满足,如果满足则返回计算值,如果不满足则重复计算。

既然你不想要完整的解决方案,只需要一个建议去哪里,好好看看loop/recur,一切都会好起来的。

@noisesmith 提出了很好的观点。reduce在条件完全满足之前不用于计算,但在执行某些步数有限的计算时可能很有用。

于 2013-11-03T09:51:22.693 回答