前言
一般地,对于java语言而言,普通的递归调用是在java虚拟机栈上完成的.假如a()是一个递归方法,那么在其内部再调用自己的时候,假设为a1(),那么a1()方法变量表将创建在a()方法栈帧之上,从而形成了一个新的栈帧.因此容易发现,在递归思想中,递归简化了问题的表达,但牺牲了虚拟机栈中的内存空间.
普通递归
斐波那契递归法
public static int fib(int num){
if(num<2)
return num;
else
return fib(num-2)+fib(num-1);
}
对于上面的解法,很容易就会发现,不但属于普通递归,而且在计算fib(num-1)是重复了fib(num-2)的计算量,因此代码效率大打折扣.因此效率较高的写法可以用for循环计算,
public static int fib3(int n) {
if (n < 2)
return n;
else {
int pre = 0;
int suf = 1;
for (int i = 2; i <= n; i++) {
int temp = suf;
suf += pre;
pre = temp;
}
return suf;
}
}
斐波那契尾递归优化
public class Main {
public static void main(String[] args) {
System.out.print(