javaScript-递归函数(js递归写法)

递归函数是一种特殊的函数,递归函数允许在函数定义中调用函数本身。考虑对于如下计算: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的阶乘,递归一定要给定中止条件,这一点与循环类型。没有中止条件的循环是死循环,不向中止点追溯的递归是无穷递归。



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

版权声明:

作者: freeclashnode

链接: https://www.freeclashnode.com/news/article-3880.htm

来源: FreeClashNode

文章版权归作者所有,未经允许请勿转载。

免费节点实时更新

热门文章

最新文章

归档