【JAVASCRIPT】递归与循环的效率比较
递归与循环是两种不同的解决问题的典型思路。
递归算法:
循环算法:
递归算法 和循环算法总结
<script type="text/javascript">
function digui(n) {
if (n <= 1) {
return 1;
}
else {
return n + digui(n - 1);
}
}
var t1, t2, i, sum = 0;
t1 = new Date();
document.writeln("循环前的时间是:" + t1.toLocaleString() + ":" + t1.getMilliseconds() + "<br>");
for (i = 1; i <= 10000; i++) {
sum += i;
}
t2 = new Date();
document.writeln("循环后的时间是:" + t2.toLocaleString() + ":" + t2.getMilliseconds() + "<br>");
alert(sum);
var t3, t4;
t3 = new Date();
document.writeln("递归前的时间是:" + t3.toLocaleString() + ":" + t3.getMilliseconds() + "<br>");
var resultdigui;
resultdigui = digui(10000);
t4 = new Date();
document.writeln("递归后的时间是:" + t4.toLocaleString() + ":" + t4.getMilliseconds() + "<br>");
</script>
注意:代码中必须有四个事件变量;
测试结果如下:(表中红色数字表示所需要的时间)
| 循环次数 | 循环 | 递归 |
| 100 | 1 | 1 |
| 1000 | 1 | 2 |
| 10000 | 5 | 堆栈溢出 |
为什么会出现堆栈溢出呢?
大家都知道递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的。具体是每次调用函数本身要保存的内容包括:局部变量、形参、调用函数地址、返回值。那么,如果递归调用N次,就要分配N*局部变量、N*形参、N*调用函数地址、N*返回值。
当递归的次数太大的时候内存不足便会出现堆栈溢出的状况了!
循环和递归根据具体情况使用!

浙公网安备 33010602011771号