code1:
object factorial{ def main(args:Array[String])={ println(factorial(args(0).toInt)) } def factorial(x:Int):Int = if (x==0) 1 else x * factorial(x-1) }
这个实现的执行过程如下,比如我们计算4的阶乘factorial(4)
factorial(4)
--> if (4==0) 1 else 4 * factorial(4-1)
-->4*factorial(3)
-->4*(3*factorial(2))
-->4*(3*(2*factorial(1)))
-->4*(3*(2*(1*factorial(0))))
-->4*(3*(2*(1*1)))
-->24
计算机在执行上述计算的过程中,需要用到“栈”,并且我们不难看到为了计算factorial(4),栈不断增大。
为了避免像这样的计算可能导致“栈溢出”,可以采用一个小技巧,就是将上述的递归转化为“尾”递归。
关于尾递归,可以参考:http://en.wikipedia.org/wiki/Tail_call
code2:
object factorial{ def main(args:Array[String])={ println(factorial(args(0).toInt,1)) } def factorial(x:Int,result:Int):Int = if (x==0) result else factorial(x-1,x*result) }
思路也很简单,不再赘述。
时间: 2024-10-03 23:56:56