Clojure Practice:Interleave - outOfmemoryError

时间:2015-04-02 04:17:52

标签: clojure

我正在尝试为自己实现'interleave'但是得到一个outOfMemoryError

我的版本应与:

相同
(interleave [1 2] [3 4])

以下是代码:

(defn myInterleav [col1 col2]
  (loop [r []
         c1 (first col1)
         c2 (first col2)]
    (if (and c1 c2)
      (recur (conj (conj r c1) c2)
        (next col1)
        (next col2))
      r)))

(myInterleav [1 2] [3 4])

版本2为'noisesmith'建议重新绑定args,但得到nullPointer错误。

(defn myIL2 [col1 col2]
  (loop [m  []
         [e1 & c1] col1
         [e2 & c2] col2]
    (if (and e1 e2)

      (recur (conj m e1 e2)
             c1
             c2)
      m
    )))

1 个答案:

答案 0 :(得分:4)

如果两个输入都不为空,则函数永远不会返回,因为col1col2的绑定不能更改。您需要重新设置循环以重新绑定到先前绑定的next,而不是初始函数输入的next。这样的事情应该有效:

  [...
  [e1 & c1] col1
  [e2 & c2] col2]
(if (and (seq col1) (seq col2))
    (recur (conj r e1 e2)
           c1
           c2)
...)