前言:
此刻我们对“递归算法无穷”大约比较重视,看官们都需要剖析一些“递归算法无穷”的相关文章。那么小编同时在网摘上搜集了一些对于“递归算法无穷””的相关文章,希望同学们能喜欢,你们快快来学习一下吧!递归函数是一种特殊的函数,递归函数允许在函数定义中调用函数本身。考虑对于如下计算:n!=n*(n-1)*(n-2)*...*1
希望能写一个简单的函数完成对n!的求值。观察上面等式发现:(n-1)!=(n-1)*(n-2)*...*1
则有如下等式:n!=n*(n-1)!
注意到等式左边需要求n的阶乘,而等式右边则是求n-1的阶乘。实质都是一个函数,因此可将求阶乘的函数定义:
<script type="text/javascript"> //定义求阶乘的函数 var factorial=function(n) { //只有n的类型是数值,才执行函数 if(typeof(n)=="number") { //当n等于1时,直接返回1 if(n==1) { return 1; } //当n不等于1时,通过递归返回值 else { return n*factorial(n-1); } } //当参数不是数值时,直接返回 else { alert("参数类型不对!"); } } //调用阶乘函数 alert(factorial(5)); </script>
结果:
上面程序中粗体字代码再次调用了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的阶乘,递归一定要给定中止条件,这一点与循环类型。没有中止条件的循环是死循环,不向中止点追溯的递归是无穷递归。
注意:递归一定要向已知点追溯,这样才能保证递归有结束的时候