Efficiently compute fibonacci number in Java
1. Inefficient approach for computing fibonacci number by using recursion. This takes big O of 2 to the n square time. O(2^N)
public static int fibonacciRecursive(int n) { if (n==0) return 0; if (n==1) return 1; return fibonacciRecursive(n-1) + fibonacciRecursive(n-2); }
2. Efficient way for computing fibonacci number by using recursion with memorization. This takes big O of N time. O(N)
public static int fibonacciRecursiveMem(int n) { return fibonacciRecursiveMem(n, new int[n+1]); } public static int fibonacciRecursiveMem(int i, int mem[]) { if (i==0 || i==1) return i; if (mem[i] == 0) { mem[i] = fibonacciRecursiveMem(i-1, mem) + fibonacciRecursiveMem(i-2, mem); } return mem[i]; }
3. Another efficient way for computing the fibonacci number using iterative approach. This also takes big O of N times. O(N)
public static int fibonacciIterative(int n) { int a = 0, b = 1, c; if (n == 0) return a; for (int i = 2; i <= n; i++) { c = a + b; a = b; b = c; } return b; }
All together with a test
public class Fibonacci { //O(2^N) public static int fibonacciRecursive(int n) { if (n==0) return 0; if (n==1) return 1; return fibonacciRecursive(n-1) + fibonacciRecursive(n-2); } //O(N) public static int fibonacciRecursiveMem(int n) { return fibonacciRecursiveMem(n, new int[n+1]); } public static int fibonacciRecursiveMem(int i, int mem[]) { if (i==0 || i==1) return i; if (mem[i] == 0) { mem[i] = fibonacciRecursiveMem(i-1, mem) + fibonacciRecursiveMem(i-2, mem); } return mem[i]; } //O(N) public static int fibonacciIterative(int n) { int a = 0, b = 1, c; if (n == 0) return a; for (int i = 2; i <= n; i++) { c = a + b; a = b; b = c; } return b; } public static void main(String args[]) { int n = 40; long current; long timeTaken; current = System.currentTimeMillis(); int fib1 = fibonacciRecursive(n); timeTaken = System.currentTimeMillis() - current; System.out.println("The "+ n +"th fibonacci number is " + fib1 + " Time taken to compute it recursively: " + timeTaken + " milliseconds"); current = System.currentTimeMillis(); int fib2 = fibonacciRecursiveMem(n); timeTaken = System.currentTimeMillis() - current; System.out.println("The "+ n +"th fibonacci number is " + fib2 + " Time taken to compute it recursively with memorization: " + timeTaken + " milliseconds"); current = System.currentTimeMillis(); int fib3 = fibonacciIterative(n); timeTaken = System.currentTimeMillis() - current; System.out.println("The "+ n +"th fibonacci number is " + fib3 + " Time taken to compute it iteratively: " + timeTaken + " milliseconds"); } }
Output:
The 40th fibonacci number is 102334155 Time taken to compute it recursively: 552 milliseconds The 40th fibonacci number is 102334155 Time taken to compute it recursively with memorization: 0 milliseconds The 40th fibonacci number is 102334155 Time taken to compute it iteratively: 0 milliseconds
Search within Codexpedia
Custom Search
Search the entire web
Custom Search
Related Posts