在了解了Java的虚拟机内存模型后,就理解了方法调用的过程。
方法调用:就是将参数、局部变量等信息压入Java方法栈中,因此,随着方法调用深度增加,方法栈也会越来越深。
一:用递归方式实现斐波那契数列,这种方式由于大量重复计算,会导致效率极低。
//递归方式实现斐波那契
public int fibonacciByRecursion(int n) {
if(n==1){
//递归的结束条件
return 0;
}else if(n==2){
//递归的结束条件
return 1;
}else if(n>2){
//递归的本质就是自我调用,不断分解问题
return fibonacciByRecursion(n-1)+fibonacciByRecursion(n-2);
}else{
//如果输入小于1的整数,则输出0
return 0;
}
}
二:用递推实现斐波那契,效率较高。
public int fibonacciByCircle(int n){
//表示第一个数和第二个数,这是初始条件
int i=0,j=1,sum=0;
if(n<=2){
return n-1;
}else{
//开始循环
for(int k=3;k<=n;k++){
//求出这次循环的结果
sum=i+j;
//为下一次循环更新数据
i=j;
j=sum;
}
return sum;
}
}
三:用尾递归实现斐波那契,效率接近递推,这种方式不会耗费大量栈内存,只会耗费固定内存,而且没有重复计算,本质与递推类似
//尾递归方式实现斐波那契
public int fibonacciByTailRecursion(int n,int i,int j) {
if(n==1){
//递归的结束条件
return i;
}else if(n==2){
//递归的结束条件
return j;
}else if(n>2){
//每次n减1就是运算一次,然后更新i和j,这里的计算和参数共同构成迭代
return fibonacciByTailRecursion(n-1,j,i+j);
}else{
//如果输入小于1的整数,则输出0
return 0;
}
}