近日做项目时用到啦,递归。因为本人未学习到算法
所以对递归和函数理解不深
犯啦一个很无厘头的错啦
贴出来简化代码让大家见笑一下。
需求是使用 递归算出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;
}
}
}
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;
}
}
}
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值然后输出结束