3

我正在尝试提高 Clojure 的学习曲线,并且我正在编写一个简单的程序,该程序应该输出给定字符串的排列列表。我的递归解决方案将多次调用自身(因此有一个调用树而不是一维堆栈)。我试图了解,给定一个列表,我如何多次调用一个函数,每次调用时给它一个列表中的元素。我目前的代码是

(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 并使用地图运算符,但我知道 Clojure 本身并不支持柯里化。这样做的首选方法是什么?还是我只是离基地很远,需要采取完全不同的方法?

4

1 回答 1

0

doseq是表示强制执行 foreach 的惯用方式。map 产生一个惰性序列,因此在使用该序列之前不会执行。您可以使用 doseq 编写命令式的 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 回答