递归
如果你进一家公司,面试官问你递归的问题,那么他对你的要求就挺高了。但是很多公司有明文规定项目中不能使用递归!(黑人问号脸???)
当我们学会递归以后就能明白这两句看似矛盾的话究竟是怎么回事了。
进入正题!我们首先要知道什么是递归?
递归
满足以下三个特点:
1、函数自己调用自己;
2、一般情况下有参数;
3、一般情况下有return
我们要知道,递归能解决循环能做的所有事情,有一些循环不容易解决的事情,递归就能比较容易的解决
递归都可以写出来,但是不知道为什么这么写就对。
接下来上案例:
计算1~n的和?
方法一:循环
<script>
function sum(n) {
var res = 0;//声明一个用于累加和的值
for (var i = 1; i <= n; i++) {
res += i;
}
return res;
}
alert(sum(100));
</script>
这里可以得到1~100的累加和
方法二:递归
为了让我们能够更加得心应手的运用递归
这里我们有一套专门编写递归的方法:
1、首先去找临界值,即无需计算可获得的值;
2、找这一次和上一次的关系;
3、假设当前函数已经可以使用,调用自身计算上一次
我们可以得到1~99的和 与 1~100的和之间的关系
sum(100) = sum(99) + 100
则 sum(n) = sum(n - 1) + n
<script>
function sum(n) {
if (n == 1) { //找到一个临界值
return 1;
}
return sum(n - 1) + n;
}
alert(sum(100));
</script>
同样得到我们想要的结果
但是我们可能不明白为什么这么写,其实就是在没进行到临界值之前,递归会开大量的内存去计算每一个公式,最后执行到临界值的时候,就把所有的内存释放掉,得到我们需要的结果。
最后回到我们刚开始说的问题,这两句看似矛盾的话究竟是怎么回事呢
是因为只要你能理解递归,那么你就对内存管理机制和垃圾回收机制了解的非常深刻。
而公司明文规定不能使用递归是因为比较危险,因为只要你写递归的话,函数调用的值只要是不确定的,那么一旦它发生故障,就会瞬间产生许多内存,程序可能会崩溃,带来比较严重的后果。