Skip to content

Commit 6695287

Browse files
committed
Added different approaches to Fibonacci Numbers
1 parent 8503b1a commit 6695287

File tree

3 files changed

+69
-6
lines changed

3 files changed

+69
-6
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.ctci.recursionanddp;
2+
3+
/**
4+
* The fabled fibonacci numbers problem with three different solutions.
5+
* The {@link FibonacciNumber#fibonacciBottomUpOptimized(int)} version is the most optimized among all w.r.t space
6+
* and time. See {@link com.rampatra.dynamicprogramming.FibonacciNumbers} for Fibonacci series.
7+
*
8+
* @author rampatra
9+
* @since 2019-02-26
10+
*/
11+
public class FibonacciNumber {
12+
13+
private static int fibonacciTopDown(int n, int[] memo) {
14+
if (n == 0 || n == 1) return n;
15+
16+
if (memo[n] != 0) {
17+
return memo[n];
18+
} else {
19+
memo[n] = fibonacciTopDown(n - 1, memo) + fibonacciTopDown(n - 2, memo);
20+
return memo[n];
21+
}
22+
}
23+
24+
private static int fibonacciBottomUp(int n) {
25+
if (n == 0 || n == 1) return n;
26+
27+
int[] memo = new int[n + 1];
28+
memo[1] = 1;
29+
for (int i = 2; i <= n; i++) {
30+
memo[i] = memo[i - 1] + memo[i - 2];
31+
}
32+
return memo[n];
33+
}
34+
35+
private static int fibonacciBottomUpOptimized(int n) {
36+
if (n == 0 || n == 1) return n;
37+
38+
int a = 0;
39+
int b = 1;
40+
int res = a + b;
41+
42+
for (int i = 2; i <= n; i++) {
43+
res = a + b;
44+
a = b;
45+
b = res;
46+
}
47+
48+
return res;
49+
}
50+
51+
public static void main(String[] args) {
52+
System.out.println(fibonacciTopDown(4, new int[5]));
53+
System.out.println(fibonacciBottomUp(4));
54+
System.out.println(fibonacciBottomUpOptimized(4));
55+
System.out.println("---");
56+
System.out.println(fibonacciTopDown(5, new int[6]));
57+
System.out.println(fibonacciBottomUp(5));
58+
System.out.println(fibonacciBottomUpOptimized(5));
59+
System.out.println("---");
60+
System.out.println(fibonacciTopDown(10, new int[11]));
61+
System.out.println(fibonacciBottomUp(10));
62+
System.out.println(fibonacciBottomUpOptimized(10));
63+
}
64+
}

src/main/java/com/rampatra/dynamicprogramming/FibonacciNumbers.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
*
1010
* @author rampatra
1111
* @since 9/10/15
12-
* @time: 3:57 PM
1312
*/
1413
public class FibonacciNumbers {
1514

@@ -22,9 +21,9 @@ public class FibonacciNumbers {
2221
* @param k
2322
*/
2423
public static int[] getFirstKFibonacciNumbers(int k) {
25-
int[] fib = new int[k + 1];
24+
int[] fib = new int[k];
2625
int i = 1;
27-
while (i <= k) {
26+
while (i < k) {
2827
if (i == 1 || i == 2) {
2928
fib[i] = 1;
3029
} else {
@@ -35,7 +34,7 @@ public static int[] getFirstKFibonacciNumbers(int k) {
3534
return fib;
3635
}
3736

38-
public static void main(String a[]) {
37+
public static void main(String[] a) {
3938
out.println(Arrays.toString(getFirstKFibonacciNumbers(0)));
4039
out.println(Arrays.toString(getFirstKFibonacciNumbers(10)));
4140
out.println(Arrays.toString(getFirstKFibonacciNumbers(46)));

src/main/java/com/rampatra/misc/DivideByZero.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@
1010
public class DivideByZero {
1111
public static void main(String[] a) {
1212
System.out.println(5.0 / 0); // doesn't throw any exception
13-
System.out.println(5 / 0); // throws runtime exception (arithmetic exception)
13+
System.out.println(5 / 0); // throws runtime exception or unchecked exception (does NOT need explicit handling). To be specific, throws an arithmetic exception.
1414
}
15-
}
15+
}

0 commit comments

Comments
 (0)