【发布时间】:2014-01-20 16:20:14
【问题描述】:
我已经将这段代码(下面的 sn-p)从 Python 翻译成 Clojure。我在这里用 Clojure 的 loop-recur 替换了 Python 的 while 构造。但这看起来并不惯用。
(loop [d 2 [n & more] (list 256)]
(if (> n 1)
(recur (inc d)
(loop [x n sublist more]
(if (= (rem x d) 0)
(recur (/ x d) (conj sublist d))
(conj sublist x))))
(sort more)))
这个例程给了我(3 3 31),这是279 的素数。对于256,它给出(2 2 2 2 2 2 2 2),这意味着2^8。
此外,对于较大的值,它的性能更差,比如987654123987546 而不是279;而 Python 的对应物就像魅力一样。
如何开始编写核心函数,而不是按原样翻译命令式代码?具体来说,如何改进这一点?
谢谢。
[已编辑]
这是我上面提到的python代码,
def prime_factors(n):
factors = []
d = 2
while n > 1:
while n % d == 0:
factors.append(d)
n /= d
d = d + 1
return factors
【问题讨论】:
-
Adeel,这对我来说似乎是一个非常笼统的问题,关于一个非常具体的案例。如果您解释了例程应该做什么,这将有助于其他人提供有用的建议。它还可以帮助您详细说明例程应该做什么——不是这段代码详细做什么,而是抽象地说明代码应该完成什么。然后你可以去寻找有助于做到这一点的代码和函数。或者您可以询问有关如何开始编写可以做到这一点的代码的问题。
-
@Mars:谢谢你的建议。我已对其进行了更新,以包含简要说明和输出。
-
能否贴出原python代码供参考?
-
@DominicKexel: 贴出原Python函数。
-
见rosettacode.org/wiki/Prime_decomposition#Clojure
(factors 279) ;; (31 3 3)
标签: performance clojure functional-programming lisp idioms