首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SICP sqrt NullPointerException

SICP sqrt NullPointerException
EN

Stack Overflow用户
提问于 2011-10-13 12:11:27
回答 2查看 478关注 0票数 6

在Clojure中实现一些开始的SICP代码时,我遇到了意外的NullPointerException。具体地说,我想实现1.1.7节中的迭代平方根过程。

代码如下:

代码语言:javascript
复制
(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)))))

这适用于足够小的值,例如(sqrt 16)。对于任何大于近似(square 2718)的输入,我都会得到一个NullPointerException clojure.lang.Numbers.lt (Numbers.java:3693)错误。

有什么想法吗?

使用整个回溯进行更新(前一个是我在repl中得到的全部):

在sicp_in_clojure.chapter_one$sqrt$good_enough_QMARK___14.invoke(chapter_one.clj:40)、sicp_in_clojure.chapter_one$sqrt.invoke(chapter_one.clj:43)、sicp_in_clojure.chapter_one$sqrt.invoke(chapter_one.clj:37)、sicp_in_clojure.chapter_one$eval19.invoke的线程"main“java.lang.NullPointerException at clojure.lang.Numbers.lt(Numbers.java:3693)中出现异常(clojure.lang.Compiler.eval(Compiler.java:6465) at clojure.lang.Compiler.load(Compiler.java:6902) at clojure.lang.Compiler.loadFile(Compiler.java:6863) at clojure.main$load_script.invoke(main.clj:282) at clojure.main$script_opt.invoke(main.clj:342) at clojure.main$main.doInvoke(main.clj:426) at clojure.lang.RestFn.invoke(RestFn ).java:408)在clojure.lang.Var.invoke(Var.java:401)在clojure.lang.AFn.applyToHelper(AFn.java:161)在clojure.lang.Var.applyTo(Var.java:518)在clojure.main.main(main.java:37)

EN

回答 2

Stack Overflow用户

发布于 2012-06-27 07:29:27

不确定这是否仍然相关,但我认为值得使用LightTable Playground应用程序尝试一下,它可以让你看到事情是如何解释的:

你有没有尝试过最近的版本,比如新的Clojure 1.4.0版本?

票数 1
EN

Stack Overflow用户

发布于 2011-10-14 01:43:45

嘿,它对我来说很好。我使用的是clojure 1.3.0。以下是运行良好的终端output.The代码。

代码语言:javascript
复制
[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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7749374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档