2

私はブラックジャックですべての潜在的なディーラー ハンドに触れようとしていますが、スタックを吹き飛ばし続けていると、物事が最初に期待したほど深くないことに気付きました。そこで、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

私が期待するものを生成します:012345678999999999999988888888888

Clojure の出力を Ruby の出力のように見せる方法を誰か教えていただければ幸いです。

ありがとう、ジョン

4

1 に答える 1

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....

于 2012-12-05T06:45:14.690 に答える