3

私は Clojure の学習曲線を取得しようとしています。特定の文字列の順列のリストを出力する単純なプログラムを作成しています。私の再帰的ソリューションは、それ自体を複数回呼び出します (1-D スタックではなく呼び出しツリーが存在するように)。リストを指定すると、関数を複数回呼び出して、呼び出しごとにリストから1つの要素を与える方法を理解しようとしています。私の現在のコードは

(def permuteCat (
    fn [string printlist appendval]
    ( permute string (concat printlist (list appendval)) )
))

(def permuteRecurse (
    fn [string printlist appendlist]
    (
    map (partial permuteCat string printlist) appendlist
    )
))

(def permute (
    fn [string printlist] 
    (if ( == (count printlist) (.length string) )
        (println printlist)
        ( permuteRecurse string printlist ( range (- (.length string) (count printlist)) ) ) 
    )
)
)

ただし、permuteCat() が permuteRecurse() によって呼び出されることはないようです。OCaml のような言語では permuteCat をカリー化して map 演算子を使用しますが、Clojure がカリー化をネイティブにサポートしていないことは理解しています。これを行うための好ましい方法は何ですか? それとも、私はベースから外れており、まったく異なるアプローチを取る必要がありますか?

4

1 に答える 1

0

dosqは、foreach の強制実行を表す慣用的な方法です。map は遅延シーケンスを生成するため、シーケンスが使用されるまで実行は行われません。dosq を使用して命令型の foreach ループを記述できますが、シーケンスの作成とそれを使用してやりたいこと (この場合は印刷ですが、後で代わりに検索する必要があるかもしれません) を分離するとさらに良いでしょう。

; specify the sequence
(defn foo [v] (map inc v))

; print it
(doseq [v (foo [1 2 3])]
  (println v))
于 2012-11-21T15:55:32.673 に答える