我试图以递归方式在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)))
我是否正确使用第一段代码?我甚至可能尝试过什么?
答案 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