简单的clojure程序之后的NullPointerException

时间:2013-03-27 00:18:35

标签: clojure

我正在努力学习clojure,并且遇到了似乎与我的代码无关的NullPointerException。程序在产生错误之前运行完成。代码:

; solves the collatz conjecture

; return one step in the sequence
(defn collatz-step [n] 
  (if (= (rem n 2) 0)
    (/ n 2)
    (+ 1 (* 3 n))))

; recurse over all numbers
(defn collatz [n] 
  (if (= n 1)
    (println "All done!")
    ((println (format "N = %d" n)) 
     (collatz (collatz-step n)))))

; get input and run it
(println "Enter a positive number:")
(collatz (read-string (read-line)))                                                                                  

我有什么遗失的吗?

1 个答案:

答案 0 :(得分:3)

此行开始时:

((println (format "N = %d" n)) 
 (collatz (collatz-step n)))
println和colatz将完成这样的形式:

 (return-value-of-println return-value-of-collatz)

println返回nil屈服:

 (nil return-value-of-collatz)

是对函数nil的函数调用,导致NPE

取出额外的()

<小时/> Clojure没有尾部调用消除,因此将递归调用更改为collatzrecur将使其不会在大的n

值上烧掉堆栈