【JAVASCRIPT】递归与循环的效率比较
2012-07-30 18:23
387 查看
递归与循环是两种不同的解决问题的典型思路。
递归算法:
优点:代码简洁、清晰,并且容易验证正确性。(如果你真的理解了算法的话,否则你更晕)缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。
循环算法:
优点:速度快,结构简单。缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。
递归算法 和循环算法总结
1. 一般递归调用可以处理的算法,也通过循环去解决常需要额外的低效处理 。2. 现在的编译器在优化后,对于多次调用的函数处理会有非常好的效率优化,效率未必低于循环。
为了检测这两种算法的效率,net小伙专门做了一个测试,代码如下:
<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>
注意:代码中必须有四个事件变量;
测试结果如下:(表中红色数字表示所需要的时间)
[b]循环次数[/b] | [b]循环[/b] | [b]递归[/b] |
100 | 1 | 1 |
1000 | 1 | 2 |
10000 | 5 | 堆栈溢出 |
大家都知道递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的。具体是每次调用函数本身要保存的内容包括:局部变量、形参、调用函数地址、返回值。那么,如果递归调用N次,就要分配N*局部变量、N*形参、N*调用函数地址、N*返回值。
当递归的次数太大的时候内存不足便会出现堆栈溢出的状况了!
循环和递归根据具体情况使用!
相关文章推荐
- 递归和循环效率比较
- 递归的效率问题及递归与循环比较
- 递归求和(Recursive)与for循环求和效率问题的简单比较
- 递归的效率问题及递归与循环比较
- 递归的效率问题及递归与循环比较
- JavaScript数组的3种循环方式效率的比较
- 递归与循环比较
- Java中迭代列表中数据时几种循环写法的效率比较
- C++几种循环效率比较
- JavaScript判断是否为数字的4种方法及效率比较
- 关于for循环与for-each的效率比较
- 对300万一张表数据,用游标进行循环,不同写法的效率比较
- javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较
- for 循环性能比较 提高for循环的效率
- for、foreach和MoveNext循环效率粗比较
- 比较JavaScript中的集合及其检索效率(转)
- 如何提升JavaScript的递归效率
- 【郝斌数据结构自学笔记】53-56_一个函数为什么可以自己调用自己_递归必须满足三个条件_循环和递归的比较
- javascript递归、循环、迭代、遍历和枚举概念
- 递归 循环 比较