題目
給定n,求斐波那契數列第n位的數值。
斐波那契數列:0 1 1 2 3 5 8 13 ……
每個數等于前面兩個數相加,第n位等于第(n - 1)位加上第(n - 2)位。
原理
去重遞歸
使用遞歸的方式計算出結果,但使用一個數組保存已經計算出來的值,防止重復計算,提高性能。
雙指針迭代
定義一個指針 low = 0,和一個指針 high = 1,每次迭代將 low + high 賦值給 high,將原來的 high 賦值給 low,從2開始遍歷到n即得出結果。
代碼
去重遞歸
public static void main(String[] args) {
System.out.println(fibonacciByRecursion(10));
}
private static int fibonacciByRecursion(int n) {
int[] fibonacciArr = new int[n + 1];
return recursion(n, fibonacciArr);
}
private static int recursion(int n, int[] fibonacciArr) {
if (n == 0 || n == 1) {
return n;
}
if (fibonacciArr[n] != 0) {
return fibonacciArr[n];
}
return recursion(n - 1, fibonacciArr) + recursion(n - 2, fibonacciArr);
}
雙指針迭代
public static void main(String[] args) {
System.out.println(fibonacciByTwoPointer(10));
}
private static int fibonacciByTwoPointer(int n) {
if (n == 0 || n == 1) {
return n;
}
int low = 0, high = 1;
for (int i = 2; i <= n; i++) {
int sum = low + high;
low = high;
high = sum;
}
return high;
}