我记得以前写过一个 Python 程序来做同样的事情。我记得认为该算法很聪明,但现在尝试在 Clojure 中从内存中实现它我遇到了一些问题。
我对 Clojure 还很陌生,所以我知道我可能没有以最好的方式做到这一点。
下面我使用单词“herps”作为测试,它应该返回该单词所有可能组合的列表。我终于得到了正确的组合,但它们是嵌套的,我想要一个单词的平面列表。我认为这是因为 for 返回一个 lazy seq
,但我不知道如何解决它。
(ns combos.core
(:gen-class))
(use '[clojure.string :only [join]])
(defn rmletter [in letter]
(join (remove #(= letter %) in)))
(defn combo [total in]
(if (= (count in) 1)
(concat total (list in))
(for [item in]
(do
(if (= (count in) 5) (print "top: "))
(combo (concat total (list item)) (rmletter in item)))
)))
(defn -main
"I don't do a whole lot ... yet."
[& args]
;; work around dangerous default behaviour in Clojure
(alter-var-root #'*read-eval* (constantly false))
(doseq [item (combo nil "herps")] (print "item:")(println item))
(println "Hello, World!"))
这是输出:
top: item:((((h e r p s) (h e r s p)) ((h e p r s) (h e p s r)) ((h e s r p) (h
e s p r))) (((h r e p s) (h r e s p)) ((h r p e s) (h r p s e)) ((h r s e p) (h
r s p e))) (((h p e r s) (h p e s r)) ((h p r e s) (h p r s e)) ((h p s e r) (h
p s r e))) (((h s e r p) (h s e p r)) ((h s r e p) (h s r p e)) ((h s p e r) (h
s p r e))))
top: item:((((e h r p s) (e h r s p)) ((e h p r s) (e h p s r)) ((e h s r p) (e
h s p r))) (((e r h p s) (e r h s p)) ((e r p h s) (e r p s h)) ((e r s h p) (e
r s p h))) (((e p h r s) (e p h s r)) ((e p r h s) (e p r s h)) ((e p s h r) (e
p s r h))) (((e s h r p) (e s h p r)) ((e s r h p) (e s r p h)) ((e s p h r) (e
s p r h))))
top: item:((((r h e p s) (r h e s p)) ((r h p e s) (r h p s e)) ((r h s e p) (r
h s p e))) (((r e h p s) (r e h s p)) ((r e p h s) (r e p s h)) ((r e s h p) (r
e s p h))) (((r p h e s) (r p h s e)) ((r p e h s) (r p e s h)) ((r p s h e) (r
p s e h))) (((r s h e p) (r s h p e)) ((r s e h p) (r s e p h)) ((r s p h e) (r
s p e h))))
top: item:((((p h e r s) (p h e s r)) ((p h r e s) (p h r s e)) ((p h s e r) (p
h s r e))) (((p e h r s) (p e h s r)) ((p e r h s) (p e r s h)) ((p e s h r) (p
e s r h))) (((p r h e s) (p r h s e)) ((p r e h s) (p r e s h)) ((p r s h e) (p
r s e h))) (((p s h e r) (p s h r e)) ((p s e h r) (p s e r h)) ((p s r h e) (p
s r e h))))
top: item:((((s h e r p) (s h e p r)) ((s h r e p) (s h r p e)) ((s h p e r) (s
h p r e))) (((s e h r p) (s e h p r)) ((s e r h p) (s e r p h)) ((s e p h r) (s
e p r h))) (((s r h e p) (s r h p e)) ((s r e h p) (s r e p h)) ((s r p h e) (s
r p e h))) (((s p h e r) (s p h r e)) ((s p e h r) (s p e r h)) ((s p r h e) (s
p r e h))))
Hello, World!