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值然后输出结束 

  • 相关阅读:
    NET基础课--NET的一些概念0
    项目异常及处理方法记录
    个人总结
    NuGet学习笔记(4)—— 实践
    NuGet学习笔记(3)——搭建属于自己的NuGet服务器(转)
    NuGet学习笔记(2)——使用图形化界面打包自己的类库(转)
    NuGet学习笔记(1)——初识NuGet及快速安装使用(转)
    关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询
    <iOS>UIImage变为NSData并进行压缩
    iOS 将NSArray、NSDictionary转换为JSON格式进行网络传输
  • 原文地址:https://www.cnblogs.com/zhang888/p/digui.html
Copyright © 2011-2022 走看看