在研究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块的值.
第二个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)
(来源)