2

我正在尝试在 clojure 中递归地附加一个列表。就是解构我创建的一个POW函数,把(POW x 3)变成(* x (* xx))

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

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

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

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

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

我在第一段代码的正确道路上吗?我正在尝试的甚至可能吗?

4

3 回答 3

3

恐怕你发布的努力离题太远了。如果我要手写 pow,它看起来像这样:

(defn pow [x n]
  (if (= n 1)
    x
    (list '* x (pow x (dec n)))))
于 2012-11-06T02:29:37.370 回答
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
于 2012-11-06T00:37:38.793 回答
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
于 2012-11-06T05:14:44.577 回答