我一直在努力解决Clojure中的Project Euler问题,以便变得更好,而且我已经遇到了几次素数.我的问题是它只是花了太长时间.我希望有人可以帮我找到一种以Clojure-y方式做到这一点的有效方法.
当我拳头做到这一点时,我粗暴地强迫它.这很容易做到.但是计算10001个素数在Xeon 2.33GHz上用了2分钟,对规则来说太长了,一般来说太长了.这是算法:
(defn next-prime-slow
"Find the next prime number, checking against our already existing list"
([sofar guess]
(if (not-any? #(zero? (mod guess %)) sofar)
guess ; Then we have a prime
(recur sofar (+ guess 2))))) ; Try again
(defn find-primes-slow
"Finds prime numbers, slowly"
([]
(find-primes-slow 10001 [2 3])) ; How many we need, initial prime seeds
([needed sofar]
(if (<= needed (count sofar))
sofar ; Found enough, we're done
(recur needed (concat sofar [(next-prime-slow …
Run Code Online (Sandbox Code Playgroud) 好.我一直在修补Clojure,我不断遇到同样的问题.我们来看看这段代码:
(let [x 128]
(while (> x 1)
(do
(println x)
(def x (/ x 2)))))
Run Code Online (Sandbox Code Playgroud)
现在我希望这打印出一个以128开头的序列,如下所示:
128
64
32
16
8
4
2
Run Code Online (Sandbox Code Playgroud)
相反,它是一个无限循环,一遍又一遍地打印128.显然,我的预期副作用是行不通的.
那么我该如何在这样的循环中重新定义x的值呢?我意识到这可能不像Lisp那样(我可能会使用一个匿名函数来对它进行自我修复),但是如果我不知道如何设置这样的变量,我会发疯的.
我的另一个猜测是使用set!,但是这会给出"无效的分配目标",因为我不是绑定形式.
请告诉我这应该如何工作.
我一直在玩一些东西,并想到试图找出凯文培根数字的想法.我有一个网站的数据,为此我们可以考虑一个社交网络.让我们假装它是Facebook(为了简化讨论).我有人,我有他们的朋友列表,所以我有他们之间的联系.如何计算从一个人到另一个人的距离(基本上,凯文培根号码)?
我最好的想法是双向搜索,具有深度限制(以限制计算复杂性并避免在图中无法连接的人的问题),但我意识到这是相当暴力的.
制作小子图(比如说Facebook上的群组等)可以更好,计算它们之间的最短距离(可能提前),然后尝试使用THOSE来查找链接?虽然这需要预先计算,但它可以搜索更少的节点(节点可以是组而不是个体,使图形更小).尽管如此,这仍然是双向搜索.
我还可以预先计算个人所连接的人数,首先在节点中搜索"热门"人,因为他们最有可能连接到给定的目的地个体.我意识到这将是对可能的最短路径的速度的权衡.我想我也想使用深度优先搜索而不是我计划在其他情况下使用的广度优先搜索.
有人可以想到更简单/更快的方法吗?我希望能够找到两个人之间最短的长度,所以它并不像总是具有相同的终点那么容易(例如在Kevin Bacon问题中).
我意识到有一些问题,比如我可以获得200人的连锁等等,但这可以解决我对我愿意搜索的深度的限制.