Recursion Clojure-Collatz猜想NullPointerException

Recursion Clojure-Collatz猜想NullPointerException,recursion,clojure,collatz,Recursion,Clojure,Collatz,我一直在为下面的代码获取一个NullPointerException,我尝试了又尝试了跟踪它,但没有成功。我试图打印出collatz猜想的每一个数字,它确实打印出来了,然后给我一个空指针异常错误,我找不到它。 提前谢谢 1 (ns collatz.core 2 (:gen-class)) 3 4 5 (defn collatz [n] 6 ( 7 (println n)

我一直在为下面的代码获取一个NullPointerException,我尝试了又尝试了跟踪它,但没有成功。我试图打印出collatz猜想的每一个数字,它确实打印出来了,然后给我一个空指针异常错误,我找不到它。 提前谢谢

      1 (ns collatz.core
       2   (:gen-class))
       3 
       4 
       5 (defn collatz [n]
       6   (
       7    (println n)
       8     (if (= n 1)
       9       (println "done")
      10       (if (odd? n)
      11        (collatz
      12          (+(* n 3) 1))
      13        (collatz (/ n 2))))))

  14 (defn -main []  (collatz 48))



Exception in thread "main" java.lang.NullPointerException, compiling:(/private/var/folders/yh/80f0k44s19lgzck9bgpq746w0000gn/T/form-init1027767069879550093.clj:1:125)
    at clojure.lang.Compiler.load(Compiler.java:7391)
    at clojure.lang.Compiler.loadFile(Compiler.java:7317)
    at clojure.main$load_script.invokeStatic(main.clj:275)
    at clojure.main$init_opt.invokeStatic(main.clj:277)
    at clojure.main$init_opt.invoke(main.clj:277)
    at clojure.main$initialize.invokeStatic(main.clj:308)
    at clojure.main$null_opt.invokeStatic(main.clj:342)
    at clojure.main$null_opt.invoke(main.clj:339)
    at clojure.main$main.invokeStatic(main.clj:421)
    at clojure.main$main.doInvoke(main.clj:384)
    at clojure.lang.RestFn.invoke(RestFn.java:421)
    at clojure.lang.Var.invoke(Var.java:383)
    at clojure.lang.AFn.applyToHelper(AFn.java:156)
    at clojure.lang.Var.applyTo(Var.java:700)
    at clojure.main.main(main.java:37)
Caused by: java.lang.NullPointerException
    at collatz.core$collatz.invokeStatic(core.clj:6)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:11)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:11)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$_main.invokeStatic(core.clj:14)
    at collatz.core$_main.invoke(core.clj:14)
    at clojure.lang.Var.invoke(Var.java:375)
    at user$eval5.invokeStatic(form-init1027767069879550093.clj:1)
    at user$eval5.invoke(form-init1027767069879550093.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6927)
    at clojure.lang.Compiler.eval(Compiler.java:6917)
    at clojure.lang.Compiler.load(Compiler.java:7379)
    ... 14 more
头部位置(第7行)有
(println n)
,这意味着您试图调用
(println n)
返回的函数值
println
总是返回
nil
,因此您会得到
NullPointerException

最小的更改是使用
do
块:

(defn collatz [n]
   (do
     (println n)
     (if (= n 1)
       (println "done")
       (if (odd? n)
         (collatz
          (+ (* n 3) 1))
         (collatz (/ n 2))))))
尽管坦率地说,这在Clojure中看起来很不自然。一种更惯用的编码方式是生成一个序列,而不是将元素打印出来

此外,我强烈怀疑您不需要
gen类
。如果您只需要运行函数,请使用REPL

编辑:正如评论中指出的,真正最小的变化是删除冗余参数,因为
defn
(和
fn
)包括隐式
do

(def collatz [n]
  (println n)
  (if (= n 1)
    (println "done")
    (if (odd? n)
      (collatz
       (+ (* n 3) 1))
      (collatz (/ n 2)))))

最小的更改是删除参数列表后的错误括号,因为
defn
有一个隐式的
do
@TerjeD。-你说得对。我很少需要它(仅用于调试打印输出),以至于我忘记了它。