我正在努力学习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)))
我有什么遗失的吗?
答案 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没有尾部调用消除,因此将递归调用更改为
collatz
到recur
将使其不会在大的n 值上烧掉堆栈