Clojure 如何将函数多次应用于序列
我正在使用Clojure编写一些Lisp。我试图在不利用向量和Clojure函数的情况下进行这些练习 此函数Clojure 如何将函数多次应用于序列,clojure,Clojure,我正在使用Clojure编写一些Lisp。我试图在不利用向量和Clojure函数的情况下进行这些练习 此函数 (defn rev-seq [s1] (concat (pop s1) (list (peek s1)))) 将列表的第一个元素放在末尾。我希望调用此函数的次数与反转列表所需的次数相同(无需调用Clojure的reverse函数) 我不知道用什么来代替它。我尝试了map、apply和repeat,但没有成功。我宁愿有一种不同的思考方式,而不是直接的回答,但我不是要求讨论
(defn rev-seq
[s1]
(concat (pop s1) (list (peek s1))))
将列表的第一个元素放在末尾。我希望调用此函数的次数与反转列表所需的次数相同(无需调用Clojure的reverse
函数)
我不知道用什么来代替它。我尝试了map、apply和repeat,但没有成功。我宁愿有一种不同的思考方式,而不是直接的回答,但我不是要求讨论。首先,我认为如果您想处理一般序列,您需要先将rev-seq转换为使用
/rest
,而不是peek
/pop
,至少在Clojure 1.4peek
/pop
中似乎需要一个持久堆栈:
(defn rev-seq
[s1]
(concat (rest s1) (list (first s1))))
然后您可能会注意到,重复应用此函数将“循环”列表,而不是将其反转。如果使用迭代查看少量应用程序的结果,您可以看到:
(def s '(1 2 3 4 5 6 7 8 9))
(nth (iterate rev-seq s) 3)
=> (4 5 6 7 8 9 1 2 3)
一个可行的选项是使用递归函数进行反转:
(defn reverse-seq [s]
(concat (reverse (next s)) (list (first s))))
(reverse-seq s)
=> (9 8 7 6 5 4 3 2 1)
或者,您也可以使用clojure.core中的技术进行反向操作:
(defn reverse-seq [s]
(reduce conj () s))
(reverse-seq s)
=> (9 8 7 6 5 4 3 2 1)
希望这能给你一些想法 递归功能强大!
我翻译
进入Clojure
(defn- inverte-aux
[lista resto]
(if lista
(recur (next lista) (cons (first lista) resto))
resto))
(defn inverte
[lista]
(inverte-aux lista nil))
user> (inverte [4 3 2 1 3])
(3 1 2 3 4)
事实证明(#(into()%1);(abcd))逆转了列表。也许值得指出的是,(into()'(abcd))也逆转了列表。