这两个Clojure代码块有什么区别?

Del*_*man 2 loops clojure

在研究Clojure Koans时,我不得不迭代地计算一个数字的阶乘,我确实找到了解决方案,但我对两个解决方案之间的区别提出了一个问题,一个有效,另一个有效,尽管我没有明白为什么:

有效的:

(defn factorial [n]
   (loop [n n
         acc 1]
     (if (zero? n)
      acc
      (recur (dec n) (* n acc )))
 )
Run Code Online (Sandbox Code Playgroud)

那个没有的人:

(defn factorial [n]
   (loop [n n
         acc 1]
     (if (zero? n)
      1
      (recur (dec n) (* n acc )))
 )
Run Code Online (Sandbox Code Playgroud)

请注意,唯一的区别是如果满足条件,则返回If块的值.

Jon*_*ier 5

第二个factorial函数总是返回1.代码构建为使用累加器变量(acc),第一个代码块通过返回此累加器变量使其正确.

factorial函数可以写成返回1,不过,如果不使用累加器变量.由于此方法不使用loop/ recur,因此可能导致堆栈溢出:尝试(fact 5000).

(defn factorial [x]
  (if (<= x 1)
      1
      (* x (factorial (- x 1)))))
Run Code Online (Sandbox Code Playgroud)

(来源)