Ala*_*ell 6 clojure sicp nullpointerexception
我在Clojure中实现了一些开始的SICP代码时遇到了意外的NullPointerException.特别是,我想实现1.1.7节中的迭代平方根过程.
这是代码:
(defn square [x] (* x x))
(defn abs [x]
(cond
(< x 0) (- x)
:else x))
(defn average [x y]
(/ (+ x y) 2))
(defn sqrt
([x] (sqrt 1.0 x))
([guess x]
(letfn [(good-enough? [guess]
(< (abs (- (square guess) x)) 0.001))
(improve [guess]
(average guess (/ x guess)))]
(if (good-enough? guess)
guess
(recur (improve guess) x)))))
Run Code Online (Sandbox Code Playgroud)
这适用于足够小的值,例如(sqrt 16).NullPointerException clojure.lang.Numbers.lt (Numbers.java:3693)任何大于约的输入都会出错(square 2718).
有任何想法吗?
使用整个回溯进行更新(前一个是我在repl中获得的):
位于sicp_in_clojure.chapter_one $ sqrt $ good_enough_QMARK ___ 14.invoke(chapter_one.clj:40)at sjp.in_clojure.chapter_one $ sqrt的clojure.lang.Numbers.lt(Numbers.java:3693)中的线程"main"java.lang.NullPointerException中的异常.在sicp_in_clojure.chapter_one $ sqrt.invoke(chapter_one.clj:37)的sicp_in_clojure.chapter_one $ eval19.invoke(chapter_one.clj:48)上的clojure.lang.Compiler.eval(Compiler.java)调用(chapter_one.clj:43) :在clajure.lang.Compiler.load(Compiler.java:6902)的clojure.lang.Compiler.load(Compiler.java:6902)的clojure.main $ load_script.invoke(main.clj:282)的clojure.lang.Compiler.load(Compiler.java:6902) .main $ script_opt.invoke(main.clj:342)at clojure.main $ main.doInvoke(main.clj:426)at clojure.lang.RestFn.invoke(RestFn.java:408)at clojure.lang.Var.在clojure.lang.AF.一起调用(Var.java:401)clojure.lang.AFly.applyToHelper(AFn.java:161),然后在clojure.main.main(main.java:37)的clojure.lang.Var.applyTo(Var.java:518) )
嘿,这对我来说效果很好。我正在使用 clojure 1.3.0。以下是终端输出。代码运行良好。
[user@myhost ~]$ clj
Clojure 1.3.0
user=> (defn square [x] (* x x))
#'user/square
(defn abs [x]
(cond
(< x 0) (- x)
:else x))
#'user/abs
(defn average [x y]
(/ (+ x y) 2))
#'user/average
(defn sqrt
([x] (sqrt 1.0 x))
([guess x]
(letfn [(good-enough? [guess]
(< (abs (- (square guess) x)) 0.001))
(improve [guess]
(average guess (/ x guess)))]
(if (good-enough? guess)
guess
(recur (improve guess) x)))))
#'user/sqrt
user=> (sqrt 16)
4.000000636692939
user=> (sqrt 2718)
52.134441897781194
user=> (sqrt 3000)
54.77225658092904
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
462 次 |
| 最近记录: |