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には末尾呼び出しの除去機能がないため、再帰呼び出しをcollatzに変更するrecurと、nの値が大きい場合にスタックが吹き飛ばされるのを防ぐことができます。

于 2013-03-27T00:33:57.097 に答える