public class FaboDP {
static long[] arr = null;
public static void main(String[] args) {
int n = 8;
arr = new long[n + 1];
for (int i = 0; i < arr.length; i++) {
arr[i] = -1;
}
long ctTime = System.currentTimeMillis();
long mt = printFaboTopDown(n);
int ttimetaken = (int) (System.currentTimeMillis() - ctTime) / 1000;
System.out.println("time taken " + ttimetaken + " sec. for " + n + " result = " + mt);
long ctbTime = System.currentTimeMillis();
long mtb = printFaboBottomUp(n);
int ttbimetaken = (int) (System.currentTimeMillis() - ctbTime) / 1000;
System.out.println("time taken " + ttbimetaken + " sec. for " + n + " result = " + mtb);
long cTime = System.currentTimeMillis();
long m = printFabo(n);
int timetaken = (int) (System.currentTimeMillis() - cTime) / 1000;
System.out.println("time taken " + timetaken + " sec. for " + n + " result = " + m);
Map<Integer, Integer> lookup = new HashMap<Integer, Integer>();
System.out.println("map lookup = " + usingLookupMap(n,lookup));
printFeb(10);
}
private static long printFabo(int n) {
if (n == 0)
return 0;
else if (n == 1)
return 1;
return printFabo(n - 1) + printFabo(n - 2);
}
private static long printFaboTopDown(int n) {
if (arr[n] < 0) {
if (n <= 1) {
arr[n] = n;
} else {
arr[n] = printFaboTopDown(n - 1) + printFaboTopDown(n - 2);
}
}
return arr[n];
}
private static long printFaboBottomUp(int n) {
arr[0] = 0;
arr[1] = 1;
for (int i = 2; i <= n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[n];
}
private static int usingLookupMap(int n, Map<Integer, Integer> lookup) {
if(n<=1)return n;
if(!lookup.containsKey(n)) {
int val = usingLookupMap(n-1, lookup) + usingLookupMap(n-2, lookup);
lookup.put(n, val);
}
return lookup.get(n);
}
//iiterative
private static void printFeb(int num) {
int m =0;
int n =1;
for(int i=0;i<num;i++) {
int x = m+n;
System.out.print(m+" ");
m = n;
n = x;
}
}
}
static long[] arr = null;
public static void main(String[] args) {
int n = 8;
arr = new long[n + 1];
for (int i = 0; i < arr.length; i++) {
arr[i] = -1;
}
long ctTime = System.currentTimeMillis();
long mt = printFaboTopDown(n);
int ttimetaken = (int) (System.currentTimeMillis() - ctTime) / 1000;
System.out.println("time taken " + ttimetaken + " sec. for " + n + " result = " + mt);
long ctbTime = System.currentTimeMillis();
long mtb = printFaboBottomUp(n);
int ttbimetaken = (int) (System.currentTimeMillis() - ctbTime) / 1000;
System.out.println("time taken " + ttbimetaken + " sec. for " + n + " result = " + mtb);
long cTime = System.currentTimeMillis();
long m = printFabo(n);
int timetaken = (int) (System.currentTimeMillis() - cTime) / 1000;
System.out.println("time taken " + timetaken + " sec. for " + n + " result = " + m);
Map<Integer, Integer> lookup = new HashMap<Integer, Integer>();
System.out.println("map lookup = " + usingLookupMap(n,lookup));
printFeb(10);
}
private static long printFabo(int n) {
if (n == 0)
return 0;
else if (n == 1)
return 1;
return printFabo(n - 1) + printFabo(n - 2);
}
private static long printFaboTopDown(int n) {
if (arr[n] < 0) {
if (n <= 1) {
arr[n] = n;
} else {
arr[n] = printFaboTopDown(n - 1) + printFaboTopDown(n - 2);
}
}
return arr[n];
}
private static long printFaboBottomUp(int n) {
arr[0] = 0;
arr[1] = 1;
for (int i = 2; i <= n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[n];
}
private static int usingLookupMap(int n, Map<Integer, Integer> lookup) {
if(n<=1)return n;
if(!lookup.containsKey(n)) {
int val = usingLookupMap(n-1, lookup) + usingLookupMap(n-2, lookup);
lookup.put(n, val);
}
return lookup.get(n);
}
//iiterative
private static void printFeb(int num) {
int m =0;
int n =1;
for(int i=0;i<num;i++) {
int x = m+n;
System.out.print(m+" ");
m = n;
n = x;
}
}
}