只要abs和avg定义:
(defn sqrt [x]
(letfn [(s [guess]
(if (good-enough? guess)
guess
(s (improve guess))))
(good-enough? [guess]
(< (abs (- (square guess) x)) 0.0001))
(improve [guess]
(avg (/ x guess) guess))]
(s 1.0)))
Run Code Online (Sandbox Code Playgroud)
请忽略一下我在这里重新发明轮子.:)这只是一个例子.
如果是这样,有没有办法绕过这个,所以每次调用函数时都不会一次又一次地绑定名称,并且不在函数外引入更多名称?
中定义的函数
letfn每次sqrt调用都会重新定义吗?
是的。
每次输入函数时, 和 的 绑定都会被重新创建。他们所束缚的事物被重新构建。sgood-enoughsqrt
s和函数good-enough(实际上是fn特殊形式)在执行时编译一次。(defn sqrt ... )x每次致电时,他们都会关闭sqrt。IFn接口的内部类。sqrt,尽管它们所例证的类已经编译了很长时间。这取决于您所说的重新定义是什么意思。我以为不是,但是装订两侧的元素都更新了。所以现在我也这么认为。
有没有更惯用的方法来编写平方根函数?
是的。
在 JVM 上...
(defn sqrt [x] (Math/sqrt x))
(sqrt 2);1.4142135623730951
Run Code Online (Sandbox Code Playgroud)