2013-03-27 64 views
2

我正在学习clojure,并且遇到了似乎与我的代码无关的NullPointerException。该程序在生成错误之前运行完成。代码:简单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)))                     

有什么我失踪了吗?

回答

3

当这条线运行:

((println (format "N = %d" n)) 
(collatz (collatz-step n))) 

中的println和colatz将完成leving形式是这样的:

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

的println返回nil得到:

(nil return-value-of-collatz) 

这是一个函数调用函数nil导致NPE

取出多余的()


Clojure中没有尾调用消除,所以改变你的递归调用 collatzrecur将保留它从n个

+0

哦男人的较大值吹堆栈,非常感谢。这是完全合理的。我认为要分组多个陈述,我必须在括号中列出它们。现在我了解了解决这个问题的(do)形式。 我这么长时间都在b my我的头,再次感谢! – 2013-03-27 00:41:35

+0

函数自动添加do,所以在这种情况下你不需要它。函数中的最后一个形式是返回值 – 2013-03-27 01:07:52