2

我正在学习 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)))                                                                                  

有什么我想念的吗?

4

1 回答 1

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 的较大值上炸毁堆栈

于 2013-03-27T00:33:57.097 回答