我正在尝试提高 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 本身并不支持柯里化。这样做的首选方法是什么?还是我只是离基地很远,需要采取完全不同的方法?