整个系列的所有代码和文档都在gitee和github上共享。
https://gitee.com/Juster-zhu/JusterSpaceStation
https://github.com/JusterZhu/JusterSpaceStation
-
递归的概念
简单的说,递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。.
-
递归的调用机制
列举两个小案例(1)打印问题(2)阶乘问题
//打印问题
public void test(int n)
{
if (n > 2)
{
test(n - 1);
}
Console.WriteLine("n=" + n);
}
//阶乘问题
public int Factorial(int n)
{
if (n == 1)
{
return 1;
}
else
{
return Factorial(n - 1) * n;
}
}
(1)打印问题
讲解之前我们先看一段代码,请问最终将会输出什么内容?
程序运行时,首先会进入到main方法。当程序执行到一个方法时,会开辟一个独立的空间(栈)。
-
第一次执行到test时n=4
-
进入if判断n>2 ,执行test(n-1) 这个时候就形成了递归(这一次执行又开辟了一块空间)
-
后续依次类推,在不断递归的过程会不断的开辟栈空间一直到满足推出栈的条件为止。
我们来推演一下,这段代码的运行过程:
-
1.当我们控制台输入4的时候,test的递归调用栈空间将会连续开辟如上图所示。
-
2.由于栈的特性是先入后出,那么最先被添加进去的操作将会最后执行
-
3.按照if判断的条件,n要大于2才会继续递归,那么小于和等于2将不会递归。所以按照理论来说只会输出3次。
-
4.最后当n不断被减去1直到n等于2时,则退出递归回到主栈。再依据栈的特性从栈顶开始执行。那么将会输出以下内容。
(2)阶乘问题
在我们学习完成上面的内容之后,再来学习阶乘问题就很好理解了。我们来直接推演一下程序的运行过程:
-
1.当Factorial传入的参数为1时,将会直接退出递归输出结果为1.
-
2.当Factorial传入的参数为2时,将会进入递归Factorial(2-1)*2输出结果为2
-
3.当Factorial传入的参数为3时,将会进入递归Factorial(3-1)* 3 ,然后因为n != 1 继续递归,将会变成Factorial(2-1)* 2 * 3输出最终结果为6
-
4.当Factorial传入的参数为4时,按照之前的推算逻辑最终结果是24
递归调用规则:
1.当程序执行到一个方法时,就会开辟一个独立的空间(栈)
2.每个空间的数据(局部变量),是独立的。