>>> def factorial(n):... result = 1... i = 1... while i <= n:... result *= i... i += 1... return result... >>> factorial(5)120>>> factorial(10)3628800 上面的 factorial 定义了两个变量 i 和 result ,然后使用 while 迭代计算出阶乘。
user=> (defn factorial [n] (loop [i 1, result 1] (if (> i n) result (recur (inc i) (* i result)))))#'user/factorialuser=> (factorial 5)120user=> (factorial 10)3628800
嗯,这个 factorial 函数有点复杂,需要花些时间解释一下:
第一行是我们的老朋友 defn ,它定义一个名为 factorial 的函数,factorial 函数只接受一个参数 n 。
第二行是我们的新朋友,loop ,它和 defn 的使用方式有点类似,同样都是使用一个大括号将一些东西包围起来,这里是 [ i 1, result 1] ,这是什么意思呢?嗯,这就是说,要在 loop 形式之内,构建两个新的临时变量 i 和 result ,它们两个的值都是 1 。这些临时变量只能用在 loop 包围的地方。
第三行是我们的另一个老朋友 if ,它判断如果变量 i 比 参数 n 还要大的时候,就返回变量 result 作为函数的值。
>>> def factorial(n):... result = 1... for i in range(1, n+1):... result *= i... return result... >>> factorial(5)120>>> factorial(10)3628800 你是对的, factorial 这么写更简洁一些(事实上,这个写法在 n 很大的时候会出现性能问题),但是,那样的话,对比一看,我们忽然发现一个严重的问题: 解决同一个问题, Clojure 使用的代码居然比 Python 要复杂!