本菜鸟刚刚看书看到递归了,发现解决某些问题的时候还是挺好的,所以把它弄出来学习一下。
递归其实就是除了可以调用其他的方法,它还能调用它自己。它把大的问题转化为小的问题,再转化到最小解,然后再返回往上调用,得出解。同时,我在别的BLOG中看到几点要素和注意事项把它给拉过来记录一下:
(1)递归操作的每两步都是有紧密的联系,如在“递归”的“归操作时”,前一次的输出就是后一次的输入。
(2)必须要有结束递归的条件。
(3)递归必须要有一个递归出口。
(4)大规模的问题不适合递归,因为需要进栈出栈比较频繁,效率比较低,还容易造成栈溢出。
比如最最常用的阶乘的问题,如果数字小的话就可以用递归来解决:
int Factorial(int i) { if (i <= 1) return i; else return i * Factorial(i - 1); } static void Main(string[] args) { Program pro = new Program(); Console.WriteLine(pro.Factorial(5)); }
上面的Factorial方法,每当调用自己的时候会有一个新的帧被压到栈里面去,所以如果数字大的话,很容易就造成栈的溢出,那就只能用其他的方法。
下面有一个例子是这样的:
static void Main(string[] args) { Program pro = new Program(); pro.Test(3); } public void Test(int i) { if (i == 0) return; Test(i - 1); Console.WriteLine(i); }
这个的输出结果为:
1 2 3
上面这个递归输出3的时候,方法Test有4个不同的,独立的帧被压入了栈里面。因为栈是先进后出的,所以输出时,就是123的顺序输出。