zoukankan      html  css  js  c++  java
  • 【JAVASCRIPT】递归与循环的效率比较

    递归与循环是两种不同的解决问题的典型思路。

    递归算法:

      优点:代码简洁、清晰,并且容易验证正确性。(如果你真的理解了算法的话,否则你更晕)

      缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。

    循环算法:

      优点:速度快,结构简单。

      缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。

    递归算法 和循环算法总结

       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>

    注意:代码中必须有四个事件变量;

    测试结果如下:(表中红色数字表示所需要的时间)

     循环次数 循环 递归
    100 1 1
    1000 1 2
    10000  5 堆栈溢出

     

     

     

     

     

      为什么会出现堆栈溢出呢?

      大家都知道递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的。具体是每次调用函数本身要保存的内容包括:局部变量、形参、调用函数地址、返回值。那么,如果递归调用N次,就要分配N*局部变量、N*形参、N*调用函数地址、N*返回值。

      当递归的次数太大的时候内存不足便会出现堆栈溢出的状况了!

      循环和递归根据具体情况使用!

     

  • 相关阅读:
    分式函数的变换源
    分式之殇
    两条直线的位置关系
    数列专题思维导图
    数列通项公式思维导图
    函数与导数思维导图
    三角函数思维导图
    函数与初等函数思维导图
    集合思维导图
    npm包发布正式和测试版
  • 原文地址:https://www.cnblogs.com/ngnetboy/p/2615733.html
Copyright © 2011-2022 走看看