递归调用规则:
1.当程序执行到一个方法时,就会开辟独立的空间(栈帧)
2.每个空间的数据(局部变量),是独立的。(比如下面的图,每个栈帧都有一个n变量,互不影响)
3.递归的一个方法执行完毕,或者遇到return,就会返回到调用该方法的地方。
一、递归打印问题
public class RecursionTest {
public static void main(String[] args) {
test(4);
}
public static void test(int n) {
if(n>2) {
test(n-1);
}
System.out.println("n="+n);
}
}
步骤分析:
每执行一个方法时,就会在内存的栈中开辟一个栈帧,程序直到执行到test(2)时,才会运行Syso;
然后test(2)这个栈帧结束,回到test(3)这个栈帧(方法执行完毕,哪里调用的该方法,就返回到哪里),执行未执行过的Syso,再执行test(4)这个栈帧并输出(理解成进栈后还需要出栈!);
最后执行main栈帧,main栈帧没有需要输出的内容。
二、递归阶乘问题
public class RecursionTest {
public static void main(String[] args) {
int res = factorial(3);
System.out.println("res=" + res);
}
public static int factorial(int n) {
if(n==1) {
return 1;
}else {
return factorial(n-1)*n;
}
}
}