递归调用与一般的函数调用过程完全相同,只是被调用方法与主调方法相同而已。函数调用与正确返回是通过栈结构来实现的。
本节仔细分析了递归过程中,函数的调用、参数传递、函数返回的过程细节;通过分析揭示出递归调用的本质
1.函数调用的执行过程是串行的
2.形式参数是调用函数时临时创建的
void f(){
int a = 5;
int b = 6;;
int c = g(a,b);
c++;
}
int g(int x, int y)
{
return x + y;
}
在函数f中声明了3个局部变量a,b,c, 在内存中利用栈为其分配相应的内存空间,如右图
void f(){ 在第一个大括号开始时,分配局部变量
} //在最后一个大括号,释放已经分配的局部变量
package NO4;
public class Test02 {
public static int f(int n){
if(n == 0)//if(n <= 1)
return 1;
return n * f(n - 1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.print(f(5));
}
}
理解递归的关键在于理解形式参数在栈中存在多层的这么一种情况
可以类比生活中的一个例子:
从前有个山,山里有个庙,庙里住着俩和尚,老和尚给小和尚讲故事,讲的故事是" 从前有个山,山里有个庙"
看似像是循环,其实不是, 故事里的山和老和尚所处的山不是一回事
每次深入一层都有新的内容(故事里的可看做是形参)