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
文章版权归作者所有,未经允许请勿转载。
热门文章
- 3月4日|22M/S,V2ray/Clash(小猫咪)/SSR免费节点订阅链接每天更新
- 3月5日|20.2M/S,SSR/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 3月6日|20.1M/S,V2ray/SSR/Clash(小猫咪)免费节点订阅链接每天更新
- 3月1日|19.4M/S,V2ray/Clash(小猫咪)/Shadowrocket(小火箭)免费节点订阅链接每天更新
- 3月2日|21.9M/S,Shadowrocket(小火箭)/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 3月7日|18M/S,Clash(小猫咪)/V2ray/Shadowrocket(小火箭)免费节点订阅链接每天更新
- 2月27日|21.1M/S,SSR/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 2月26日|22.8M/S,Clash(小猫咪)/SSR/V2ray免费节点订阅链接每天更新
- 3月9日|22.9M/S,Clash(小猫咪)/V2ray/Shadowrocket(小火箭)免费节点订阅链接每天更新
- 3月8日|22.6M/S,Clash(小猫咪)/SSR/V2ray免费节点订阅链接每天更新
最新文章
- 3月24日|22.4M/S,V2ray/Clash(小猫咪)/SSR免费节点订阅链接每天更新
- 3月23日|18.8M/S,Shadowrocket(小火箭)/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 3月22日|19.8M/S,Clash(小猫咪)/V2ray/SSR免费节点订阅链接每天更新
- 3月21日|22.2M/S,V2ray/Clash(小猫咪)/SSR免费节点订阅链接每天更新
- 3月20日|22.8M/S,V2ray/SSR/Clash(小猫咪)免费节点订阅链接每天更新
- 3月19日|21.1M/S,V2ray/Clash(小猫咪)/SSR免费节点订阅链接每天更新
- 3月18日|18.7M/S,V2ray/Shadowrocket(小火箭)/Clash(小猫咪)免费节点订阅链接每天更新
- 3月17日|20.1M/S,SSR/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 3月16日|18.9M/S,Shadowrocket(小火箭)/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 3月15日|22.4M/S,Shadowrocket(小火箭)/Clash(小猫咪)/V2ray免费节点订阅链接每天更新