Clojure Collat​​z猜想NullPointerException

时间:2016-09-25 04:20:35

标签: recursion clojure collatz

我继续为以下代码获取NullPointerException,我已经尝试过并尝试跟踪它,但无济于事。我试图打印出打印出的每个数量的一个collat​​z猜想,然后给我一个空指针异常错误,我无法找到它。 提前谢谢!

      1 (ns collatz.core
       2   (:gen-class))
       3 
       4 
       5 (defn collatz [n]
       6   (
       7    (println n)
       8     (if (= n 1)
       9       (println "done")
      10       (if (odd? n)
      11        (collatz
      12          (+(* n 3) 1))
      13        (collatz (/ n 2))))))

  14 (defn -main []  (collatz 48))



Exception in thread "main" java.lang.NullPointerException, compiling:(/private/var/folders/yh/80f0k44s19lgzck9bgpq746w0000gn/T/form-init1027767069879550093.clj:1:125)
    at clojure.lang.Compiler.load(Compiler.java:7391)
    at clojure.lang.Compiler.loadFile(Compiler.java:7317)
    at clojure.main$load_script.invokeStatic(main.clj:275)
    at clojure.main$init_opt.invokeStatic(main.clj:277)
    at clojure.main$init_opt.invoke(main.clj:277)
    at clojure.main$initialize.invokeStatic(main.clj:308)
    at clojure.main$null_opt.invokeStatic(main.clj:342)
    at clojure.main$null_opt.invoke(main.clj:339)
    at clojure.main$main.invokeStatic(main.clj:421)
    at clojure.main$main.doInvoke(main.clj:384)
    at clojure.lang.RestFn.invoke(RestFn.java:421)
    at clojure.lang.Var.invoke(Var.java:383)
    at clojure.lang.AFn.applyToHelper(AFn.java:156)
    at clojure.lang.Var.applyTo(Var.java:700)
    at clojure.main.main(main.java:37)
Caused by: java.lang.NullPointerException
    at collatz.core$collatz.invokeStatic(core.clj:6)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:11)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:11)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$collatz.invokeStatic(core.clj:13)
    at collatz.core$collatz.invoke(core.clj:5)
    at collatz.core$_main.invokeStatic(core.clj:14)
    at collatz.core$_main.invoke(core.clj:14)
    at clojure.lang.Var.invoke(Var.java:375)
    at user$eval5.invokeStatic(form-init1027767069879550093.clj:1)
    at user$eval5.invoke(form-init1027767069879550093.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6927)
    at clojure.lang.Compiler.eval(Compiler.java:6917)
    at clojure.lang.Compiler.load(Compiler.java:7379)
    ... 14 more

1 个答案:

答案 0 :(得分:2)

头部位置(第7行)有<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:persistent="true"> <receiver android:name="com.majimechibireminder2.OnBootReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.HOME" /> </intent-filter> </receiver> <receiver android:name=".AlarmReceiver"></receiver> <service android:name=".ChibiReminderService" > </service> <activity android:name=".ChibiRemind"></activity> </application> ,这意味着您尝试调用(println n)返回的函数值。 (println n)始终返回println,因此您获得nil

最小的变化是使用NullPointerException块:

do

虽然坦率地说在Clojure看起来不自然。一种更惯用的编码方式是生成序列而不是打印出元素。

此外,我强烈怀疑你(defn collatz [n] (do (println n) (if (= n 1) (println "done") (if (odd? n) (collatz (+ (* n 3) 1)) (collatz (/ n 2)))))) 没有必要。如果您只需要运行您的功能,请使用REPL。

编辑:正如评论中所指出的,真正最小的变化是删除冗余的parens,因为gen-class(和defn)包含隐式{{1} }

fn