diff --git a/README.md b/README.md index 01a62e47..0ad83eb2 100644 --- a/README.md +++ b/README.md @@ -1330,6 +1330,24 @@ public class FibonacciSnippet { } } + /** + * Fibonacci series using dynamic programming. Works for larger ns as well. + * + * @param n given number + * @return fibonacci number for given n + */ + public static int fibonacciBig(int n) { + int previous = 0; + int current = 1; + for (int i = 0; i < n - 1; i++) { + int t = previous + current; + previous = current; + current = t; + } + + return current; + } + /** * Example of what an iterative implementation of Fibonacci looks like. * diff --git a/src/main/java/math/FibonacciSnippet.java b/src/main/java/math/FibonacciSnippet.java index 647aeb99..6f8dbec6 100644 --- a/src/main/java/math/FibonacciSnippet.java +++ b/src/main/java/math/FibonacciSnippet.java @@ -1,7 +1,7 @@ /* * MIT License * - * Copyright (c) 2017-2022 Ilkka Seppälä + * Copyright (c) 2017-2024 Ilkka Seppälä * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -46,6 +46,24 @@ public static int fibonacci(int n) { } } + /** + * Fibonacci series using dynamic programming. Works for larger ns as well. + * + * @param n given number + * @return fibonacci number for given n + */ + public static int fibonacciBig(int n) { + int previous = 0; + int current = 1; + for (int i = 0; i < n - 1; i++) { + int t = previous + current; + previous = current; + current = t; + } + + return current; + } + /** * Example of what an iterative implementation of Fibonacci looks like. * diff --git a/src/test/java/math/FibonacciSnippetTest.java b/src/test/java/math/FibonacciSnippetTest.java index 46af827c..ec9acd89 100644 --- a/src/test/java/math/FibonacciSnippetTest.java +++ b/src/test/java/math/FibonacciSnippetTest.java @@ -1,7 +1,7 @@ /* * MIT License * - * Copyright (c) 2017-2022 Ilkka Seppälä + * Copyright (c) 2017-2024 Ilkka Seppälä * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -51,6 +51,26 @@ void testFibonacci() { assertEquals(55, FibonacciSnippet.fibonacci(10)); } + /** + * Tests for {@link FibonacciSnippet#fibonacciBig(int)}. + */ + @Test + void testFibonacciBig() { + assertEquals(0, FibonacciSnippet.fibonacci(0)); + assertEquals(1, FibonacciSnippet.fibonacci(1)); + assertEquals(1, FibonacciSnippet.fibonacci(2)); + assertEquals(2, FibonacciSnippet.fibonacci(3)); + assertEquals(3, FibonacciSnippet.fibonacci(4)); + assertEquals(5, FibonacciSnippet.fibonacci(5)); + assertEquals(8, FibonacciSnippet.fibonacci(6)); + assertEquals(13, FibonacciSnippet.fibonacci(7)); + assertEquals(21, FibonacciSnippet.fibonacci(8)); + assertEquals(34, FibonacciSnippet.fibonacci(9)); + assertEquals(55, FibonacciSnippet.fibonacci(10)); + assertEquals(6765, FibonacciSnippet.fibonacci(20)); + assertEquals(102334155, FibonacciSnippet.fibonacci(40)); + } + /** * Tests for {@link FibonacciSnippet#iterativeFibonacci(int)}. */