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

  • 相关阅读:
    Git命令家底儿及Git数据通信原理详解
    git SSH keys
    TRIM函数
    c# List AddRange
    vtk第一个程序
    MFC CStatic类动态创建
    前端基础之BOM和DOM
    JavaScript
    前端CSS属性相关
    前端CSS
  • 原文地址:https://www.cnblogs.com/zhang888/p/digui.html
Copyright © 2011-2022 走看看