递归添加到Clojure中的列表

时间:2012-11-06 00:18:43

标签: list recursion clojure append

我试图以递归方式在clojure中附加一个列表。它是解构我创建的POW函数,将(POW x 3)转换为(* x(* x x))

我是一个真正的新手Clojure程序员,试图在Clojure中解决这个问题是很难的。我想出了:

(defn do-it [x n]
  (if (= n 0)
  (println x)
  ((dec n) (if (= x 'x))
     (list '* 'x 'x)
     (list '* 'x x))))

哪个不会编译或运行,但这就是我的计划。我的想法是每次添加另一个时减少n(* x到列表中。

我有这个,这与我尝试做的类似,但没有将POW的想法实现到函数中:

(defn do-it [x]
  (if (= x 'x)
    (list '* 'x 'x)
    (list '* 'x x)))

我是否正确使用第一段代码?我甚至可能尝试过什么?

3 个答案:

答案 0 :(得分:2)

我发布的努力远远不够,我担心。如果我打算用手写电源,它看起来像这样:

(defn pow [x n]
  (if (= n 1)
    x
    (list '* x (pow x (dec n)))))

答案 1 :(得分:1)

如果注意前缀表示法可以采用各种参数,则可以简化问题。然后你的函数看起来像这样:

(defn power [x n]
  (cons '* (repeat n x)))

(power 2 3) => (* 2 2 2)
(power 'x 2) => (* x x)

零和一个基本案例也包括在内,因为:

(power 2 1) => (* 2) ; valid result, produces 2
(power 2 0) => (*) ; valid result, produces 1

答案 2 :(得分:0)

(defn do-it [x n]
  (if (= 1 n)
    x
    (reduce (fn [chain _] `(~'* ~chain))
            `(~'* ~x ~x)
            (range 2 n))))

(do-it 5 10) ->
(* (* (* (* (* (* (* (* (* 5 5)))))))))

(do-it 5 1) ->
5