我正在尝试为自己实现'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
)))
答案 0 :(得分:4)
如果两个输入都不为空,则函数永远不会返回,因为col1
和col2
的绑定不能更改。您需要重新设置循环以重新绑定到先前绑定的next
,而不是初始函数输入的next
。这样的事情应该有效:
[...
[e1 & c1] col1
[e2 & c2] col2]
(if (and (seq col1) (seq col2))
(recur (conj r e1 e2)
c1
c2)
...)