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)

以下の理由により、0 および 1 の基本ケースもカバーされます。

(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 に答える