递归
递归就是方法自己调用自己,
既然是方法调用自己,那么一般用起来就会在它的内部进行循环,所以说一般情况下递归的效率是比较低的
递归的要点:
(1)递归操作的每两步都是有紧密的联系,如在“递归”的“归操作时”,前一次的输出就是后一次的输入。
(2)必须要有结束递归的条件。
(3)递归必须要有一个递归出口。
(4)大规模的问题不适合递归,因为需要进栈出栈比较频繁,效率比较低,还容易造成栈溢出。
先看一下下面这个简单的程序:
public static int index = 0;
public static void M1()
{
Console.WriteLine("A");
if (index < 3)
{
index++;
M1();
}
Console.WriteLine("B");
} //程序输出结果是AAAA BBBB
一开始以为应该输出AAAA B,因为程序执行了哪还有向回走的?
不过这里还真是的,开始index=0,输出第一个A,index++, 这时index=1 ,(输出B=?),。。。。。直到最后一次调用,index=3,if条件已经不满足了,这时已经输出了四个A,程序向后执行,输出第一个B,紧接着栈空间中弹出倒数第二个M1方法,输出第二个B,。。就这样输出第四个
然后呢,看下面这个:
static void Main(string[] args) { M(0); Console.ReadLine(); } public static void M(int n) { Console.WriteLine(n); n++; if (n < 3) { M(n); } Console.WriteLine(n); }
程序输出0 1 2 3 2 1
开始执行的时候,n=0,输出,比方说这时程序所在位置是A;继续执行,输出n=1,程序在B;。。。。C
当M(n)递归调用完毕后,程序向后执行输出3,这时在位置C,返回位置B,输出2,返回A,输出1