了解递归函数的返回

时间:2018-12-12 10:48:35

标签: clojure

我是Clojure的新手,正试图了解为什么以下两个功能不同。

第一

(defn rp [i]
  ((println i)
   (if (> i 3)
     (println "bye")
     (rp (inc i)))))

第二

(defn rp
  ([i] (println i)
       (if (> i 3)
         (println "bye")
         (rp (inc i)))))

当我用(rp 0)打电话给他们时,第一张会打印

0
1
2
3
4
bye
CompilerException java.lang.NullPointerException, compiling:(/Users/...) 

第二打印

0
1
2
3
4
bye
=> nil

为什么它们不同?为什么 first 函数会触发NullPointerException

1 个答案:

答案 0 :(得分:2)

您的第一个示例在身体周围有括号,并调用(println i)(即nil)的结果作为函数。例如。 ((println :a) :b)引发。在第二个示例中,最有可能与您对不同Arities的实验有关。