我正试图触碰所有潜在的经纪人手中的二十一点,但当我不断吹嘘时,我意识到事情并没有像预期的那样深入。所以我在ruby中尝试了类似的代码,它的表现不同。
此代码,
(def d [2 3 4 5 6 7 8 9 10 10 10 10 11])
(defn dig1 [lst depth tot]
(do
(print depth)
(if (< tot 17) (map #(dig1 (conj lst %) (+ depth 1) (+ tot %)) d)) ))
(dig1 [0] 0 0)
产生:011111111111112222222222222 ......
我希望map能够在d [0]上执行该函数并向下挖掘而不是查看在给定级别执行的所有操作。我显然不明白发生了什么。我是否需要做一些懒惰的事情?呃? map生成了懒惰的序列,但显然是以32个为一组进行分块。
相反,
@d = [2,3,4,5,6,7,8,9,10,10,10,10,11]
def dig(lst, depth, tot)
p depth
@d.map{|e| dig(lst.dup.push(e),depth+1,tot+e)} if tot < 17
end
产生我所期望的:0123456789999999999999888888888888
如果有人能告诉我如何让clojure输出看起来像红宝石输出,我会很感激。
谢谢,约翰
答案 0 :(得分:3)
如果您不希望返回的值返回并且仅评估副作用的序列,则通常不会使用map
。像doseq
这样的东西更可取。
(def d [2 3 4 5 6 7 8 9 10 10 10 10 11])
(defn dig1 [lst depth tot]
(print depth)
(when (< tot 17)
(doseq [i d]
(dig1 (conj lst i)
(inc depth)
(+ tot i)))))
(dig1 [0] 0 0)
制作:012345678999....