递归算法常见错误一道题考验你对递归的理解

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

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

犯啦一个很无厘头的错啦

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

 需求是使用 递归算出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值然后输出结束 

原文地址:https://www.cnblogs.com/zhang888/p/digui.html