如图,可以看到斐波那契数列是一组有规律的数列,第一项和第二项都是1,从第三项开始,都是前两项的和,以此为规律,向后延伸。
/**
* 斐波那契数列实现
* 斐波那契数列是一组有序序列,在第一个和第二个元素都为1
* 往后的数据,都等于前两个数据相加的和
*/
public class Fb {
/**
* 利用递归方式实现
* @param n
* @return
*/
public int fb1(int n ){
if (n <=2){
return 1;
}
return fb1(n -1)+fb1(n-2);
}
/**
* 在上边递归过程中,我们发现,有大量的重复计算,例如f(5) = f(3)+f(4);f(4) = f(3)+f(2)
* 这个时候,我们使用递归,重复计算了f(3)的值多次,因此可以引入一个缓存,来记录已经计算过的值,如果存在,直接返回
* 避免多次重复计算
* @param n
* @return
*/
int [] memory;
public int fb2(int n){
if (memory==null){
memory = new int[n+1];
}
if (memory[n] != 0){
return memory[n];
}
if (n == 1 || n == 2){
return 1;
}
int result = fb2(n -1) + fb2(n-2);
memory[n] = result;
return result;
}
/**
* 以上计算过程中,都是从要计算的位置的数据,进行递归,由上向下计算的
* 我们还可以从下向上,计算,直到要计算位置的数据,
* 避免递归数据的出现
* @return
*/
public int fb3( int n){
int fn_1 = 1;// 指定第一个数据为1
int fn_2 = 1;// 指定第二个数据为1
int fn = 0;// 要计算的数据的值
for (int i = 3;i<=n ;i++){
fn = fn_1 + fn_2; // 计算fn=前两项数据的和
fn_1 = fn_2;// 替换fn前两项的数据值,分别向后移动一位
fn_2 = fn;
}
return fn;
}
public static void main(String[] args) {
Fb fb = new Fb();
int r1 = fb.fb1(7);
System.out.println(r1);
int r2 = fb.fb2(7);
System.out.println(r2);
int r3 = fb.fb3(7);
System.out.println(r3);
}
}