zoukankan      html  css  js  c++  java
  • 递归算法常见错误一道题考验你对递归的理解

    近日做项目时用到啦,递归。因为本人未学习到算法

    所以对递归和函数理解不深

    犯啦一个很无厘头的错啦

    贴出来简化代码让大家见笑一下。

     需求是使用 递归算出2自增5次的值

    大家看下错误代码 

     namespace ConsoleApplication2

    {
        class Program
        {
            static void Main(string[] args)
            {
              int a=  sum(0,2);
              Console.Write(a);
              Console.ReadKey();
               
            }


            static int sum(int t, int value)
            {
                int h;
                for (h = t; h <5; )
                {
                   h++;
                    value++;
                 value=sum(h, value);
                }
                return value;

            }
        }
    }

     在看下下面这段

    代码

     namespace ConsoleApplication2

    {
        class Program
        {
            static void Main(string[] args)
            {
              int a=  sum(0,2);
              Console.Write(a);
              Console.ReadKey();
               
            }


            static int sum(int t, int value)
            {
                int h;
                for (h = t; h <5; )
                {
                   h++;
                    value++;
                sum(h, value);
                }
                return value;

            }
        }
    }


    有兴趣的童鞋可以运行一下看结果一样不

    两者 只有在  value=sum(h, value);上是不同的

     但结果却千差万别;

     其实根本愿因在于函数与递归的特性上

     对递归理解不深的(像我)会以为变量h自增5次之后就会返回值给a然后输出

    其实不然,从函数来说

    当h第一次递归到5然后返回值,值不会返回给a;

    而是返回给拉,上一次递归挂起的本身函数;而上一次挂起的函数结到值后又会顺序执行;

    大家可以调试下看看,如此会循环好几次;

    也就是value的值会增增好几次,又会因为挂起的函数被重新实例化好几次

     其实理解它简单。

    明白函数结束后要“原路返回''

     挂起的函数都在等返回值;

    接到值后又会原路执行

    然后按顺序一个一个退出

    一直到退到返回给a值然后输出结束 

  • 相关阅读:
    Redis 如何与数据库事务保持一致
    QQ、微信 唯一登陆设计
    Node.js Sequelize如何实现数据库的读写分离
    node.js web应用优化之读写分离
    在docker中使用mysql数据库,在局域网访问
    docker常用管理命令
    基于 Egg.js 框架的 Node.js 服务构建之用户管理设计
    使用mousedown、mousemove、mouseup实现拖拽效果
    VUE中事件修饰符:stop prevent self capture
    基于jsplumb插件制作可拖拽、保存流程图、重绘保存后的流程图总结
  • 原文地址:https://www.cnblogs.com/zhang888/p/digui.html
Copyright © 2011-2022 走看看