具有数据结构的Clojure递归

时间:2011-10-24 02:34:10

标签: recursion clojure

我已经尝试过这个Clojure例程的几个版本,但它总是会产生一个空指针。如何消除错误?

(defn loopthru [n] (
  (if-not (empty? n) (
       (println (first n))
       (loopthru (rest n))
  ))
))
(loopthru [1 2 3 4 5 6])

谢谢,Greg

3 个答案:

答案 0 :(得分:6)

正如大家所指出的,你的if-not宏周围有两个括号,这是不正确的。 (与Scheme不同,双括号在Clojure中很少是正确的。)但是在你的if特殊形式中还有另一个问题。应该有一个do特殊形式,它按顺序评估s表达式。

(defn loopthru [n]
  (if-not (empty? n)
    (do (println (first n))
     (loopthru (rest n)))))

其他一些事情。如果您的if语句中没有else块,请使用when / when-not。实际上,在这种情况下使用when-not消除了对do的需要,因为s表达式中没有关于条件的歧义。我必须提到强制性的评论,在这种情况下,递归会咀嚼堆栈空间,所以使用recur而不是

(defn loopthru [n]
  (when-not (empty? n)
    (println (first n))
    (recur (rest n))))

答案 1 :(得分:3)

(defn loopthru [col]
  (doseq [n col] (println n)))

(defn loopthru [f col]
  (doseq [item col] (f item)))

答案 2 :(得分:0)

应该省略函数体周围的一对括号。然后它会工作。

相关问题