2

Clojure Koans に取り組んでいる間、数値の階乗を繰り返し計算する必要があり、解決策を見つけましたが、機能するソリューションと機能しないソリューションの違いについて質問があります。理由がわかりません:

動作するもの:

(defn factorial [n]
   (loop [n n
         acc 1]
     (if (zero? n)
      acc
      (recur (dec n) (* n acc )))
 )

そうでないもの:

(defn factorial [n]
   (loop [n n
         acc 1]
     (if (zero? n)
      1
      (recur (dec n) (* n acc )))
 )

唯一の違いは、条件が満たされた場合の If ブロックの戻り値であることに注意してください。

4

2 に答える 2

5

2 番目のfactorial関数は常に を返します1。コードはアキュムレータ変数 ( acc) を使用するように作成されており、最初のコード ブロックはこのアキュムレータ変数を返すことで正しく処理されます。

ただし、アキュムレータ変数が使用されていない場合は、factorialを返す関数を作成できます。このメソッドは/を1使用しないため、簡単にスタック オーバーフローを引き起こす可能性があります: try .looprecur(fact 5000)

(defn factorial [x]
  (if (<= x 1)
      1
      (* x (factorial (- x 1)))))

ソース

于 2012-05-28T15:02:20.800 に答える