【发布时间】:2012-03-22 07:40:12
【问题描述】:
我正在尝试自学 clojure,并且我正在使用素因数 Kata 和 TDD 的原理来做到这一点。
通过一系列像这样的 Midje 测试:
(fact (primefactors 1) => (list))
(fact (primefactors 2) => (list 2))
(fact (primefactors 3) => (list 3))
(fact (primefactors 4) => (list 2 2))
我能够创建以下函数:
(defn primefactors
([n] (primefactors n 2))
([n candidate]
(cond (<= n 1) (list)
(= 0 (rem n candidate)) (conj (primefactors (/ n candidate)) candidate)
:else (primefactors n (inc candidate))
)
)
)
这很好用,直到我对其进行以下边缘案例测试:
(fact (primefactors 1000001) => (list 101 9901))
我最终遇到了堆栈溢出错误。我知道我需要将其转换为适当的递归循环,但我看到的所有示例似乎都过于简单化,只指向一个计数器或数值变量作为焦点。如何使这个递归?
谢谢!
【问题讨论】:
-
哇。这是我第一次看到有人写 Lisp 并且实际上给出了自己的台词:P
标签: recursion clojure tail-recursion prime-factoring