javaScript-递归函数

递归函数是一种特殊的函数,递归函数允许在函数定义中调用函数本身。考虑对于如下计算:n!=n*(n-1)*(n-2)*...*1

希望能写一个简单的函数完成对n!的求值。观察上面等式发现:(n-1)!=(n-1)*(n-2)*...*1

则有如下等式:n!=n*(n-1)!

javaScript-递归函数

注意到等式左边需要求n的阶乘,而等式右边则是求n-1的阶乘。实质都是一个函数,因此可将求阶乘的函数定义:

<code> 
/<code>

结果:


javaScript-递归函数

上面程序中粗体字代码再次调用了factorial()函数,这就是在函数里调用函数本身,也就是所谓的递归。上面程序执行的结果是120,可以正常求出5的阶乘。注意到程序中判断参数时,先判断参数n是否为数值,而且要求n大于0才会继续运算。事实上,这个函数不仅要求n为数值,而且必须是大于0的整数,否则函数不仅不能得到正确结果,而且将产生内存溢出。

对于上面递归函数,当n为一个大于0的整数,例如5时,5的阶乘为4的阶乘和5的乘积;同理,4的阶乘为3的阶乘和4的乘积……依次类推,直到最后1的阶乘,代码中已经写明:当n=1时,返回值为1。然后反算回去,所有的值都变成已知的。反过来,当n为负数,例如-1时,-1的阶乘为-1与-2的阶乘的乘积,-2的阶乘为-2和-3的阶乘的乘积……这将一直追溯到负无穷大,没有尽头,导致程序溢出。

可见,递归的方向很重要,一定要向已知的方向递归。对于上例而言,因为1的阶乘是已知的,因此递归一定要追溯到1的阶乘,递归一定要给定中止条件,这一点与循环类型。没有中止条件的循环是死循环,不向中止点追溯的递归是无穷递归。


javaScript-递归函数


注意:递归一定要向已知点追溯,这样才能保证递归有结束的时候


分享到:


相關文章: