import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone {
private static Map
<Integer, Integer
> fibonacciNumbers
= new HashMap
<>();
int[] testCases = {0, 1, 2, 3, 4, 5, 10, 40};
System.
out.
println("iterational algorighm"); runTestCase(Ideone::getFibonacciNumber, testCases);
System.
out.
println("recursive algorighm"); runTestCase(Ideone::getFibonacciNumberRec, testCases);
System.
out.
println("recursive algorighm with memoization"); runTestCase(Ideone::getFibonacciNumberRec2, testCases);
}
public static int getFibonacciNumber(int n) {
int previous1 = 1, previous2 = 1;
int current = 1;
for (int i = 1; i < n; i++) {
current = previous1 + previous2;
previous2 = previous1;
previous1 = current;
}
return current;
}
public static int getFibonacciNumberRec(int n) {
if (n < 2) return 1;
return getFibonacciNumberRec(n - 1) + getFibonacciNumberRec(n - 2);
}
public static int getFibonacciNumberRec2(int n) {
return fibonacciNumbers.computeIfAbsent(n, i ->
(i < 2) ? 1 : getFibonacciNumberRec2(i - 1) + getFibonacciNumberRec2(i - 2));
}
private static void runTestCase
(Function
<Integer, Integer
> function,
int[] testCases
) { long time
= System.
currentTimeMillis(); for (int testCase : testCases) {
System.
out.
println(function.
apply(testCase
)); }
System.
out.
println("Execution time - " + (System.
currentTimeMillis() - time
) + "ms"); }
}
aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKCi8qIE5hbWUgb2YgdGhlIGNsYXNzIGhhcyB0byBiZSAiTWFpbiIgb25seSBpZiB0aGUgY2xhc3MgaXMgcHVibGljLiAqLwpjbGFzcyBJZGVvbmUgewogICAgcHJpdmF0ZSBzdGF0aWMgTWFwPEludGVnZXIsIEludGVnZXI+IGZpYm9uYWNjaU51bWJlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewogICAgICAgIGludFtdIHRlc3RDYXNlcyA9IHswLCAxLCAyLCAzLCA0LCA1LCAxMCwgNDB9OwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIml0ZXJhdGlvbmFsIGFsZ29yaWdobSIpOwogICAgICAgIHJ1blRlc3RDYXNlKElkZW9uZTo6Z2V0Rmlib25hY2NpTnVtYmVyLCB0ZXN0Q2FzZXMpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlY3Vyc2l2ZSBhbGdvcmlnaG0iKTsKICAgICAgICBydW5UZXN0Q2FzZShJZGVvbmU6OmdldEZpYm9uYWNjaU51bWJlclJlYywgdGVzdENhc2VzKTsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWN1cnNpdmUgYWxnb3JpZ2htIHdpdGggbWVtb2l6YXRpb24iKTsKICAgICAgICBydW5UZXN0Q2FzZShJZGVvbmU6OmdldEZpYm9uYWNjaU51bWJlclJlYzIsIHRlc3RDYXNlcyk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Rmlib25hY2NpTnVtYmVyKGludCBuKSB7CiAgICAgICAgaW50IHByZXZpb3VzMSA9IDEsIHByZXZpb3VzMiA9IDE7CiAgICAgICAgaW50IGN1cnJlbnQgPSAxOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIGN1cnJlbnQgPSBwcmV2aW91czEgKyBwcmV2aW91czI7CiAgICAgICAgICAgIHByZXZpb3VzMiA9IHByZXZpb3VzMTsKICAgICAgICAgICAgcHJldmlvdXMxID0gY3VycmVudDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjdXJyZW50OwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEZpYm9uYWNjaU51bWJlclJlYyhpbnQgbikgewogICAgICAgIGlmIChuIDwgMikgcmV0dXJuIDE7CiAgICAgICAgcmV0dXJuIGdldEZpYm9uYWNjaU51bWJlclJlYyhuIC0gMSkgKyBnZXRGaWJvbmFjY2lOdW1iZXJSZWMobiAtIDIpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEZpYm9uYWNjaU51bWJlclJlYzIoaW50IG4pIHsKICAgICAgICByZXR1cm4gZmlib25hY2NpTnVtYmVycy5jb21wdXRlSWZBYnNlbnQobiwgIGkgLT4gCiAgICAgICAgICAgICAgICAoaSA8IDIpID8gMSA6IGdldEZpYm9uYWNjaU51bWJlclJlYzIoaSAtIDEpICsgZ2V0Rmlib25hY2NpTnVtYmVyUmVjMihpIC0gMikpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcnVuVGVzdENhc2UoRnVuY3Rpb248SW50ZWdlciwgSW50ZWdlcj4gZnVuY3Rpb24sIGludFtdIHRlc3RDYXNlcykgewogICAgICAgIGxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgIGZvciAoaW50IHRlc3RDYXNlIDogdGVzdENhc2VzKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmdW5jdGlvbi5hcHBseSh0ZXN0Q2FzZSkpOwogICAgICAgIH0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4ZWN1dGlvbiB0aW1lIC0gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIm1zIik7CiAgICB9Cn0=