diff --git a/lib/fibonacci.rb b/lib/fibonacci.rb index 7465c25..23e3b18 100644 --- a/lib/fibonacci.rb +++ b/lib/fibonacci.rb @@ -1,8 +1,26 @@ # Improved Fibonacci -# Time Complexity - ? -# Space Complexity - ? (should be O(n)) -# Hint, you may want a recursive helper method +# Time Complexity - O(n) +# Space Complexity - O(n) def fibonacci(n) - + raise ArgumentError.new "n must be greater than or equal to 0" if n < 0 + + fib_array = [0, 1] + while fib_array.length < n + 1 + fib_array.push(0) + end + + if n <= 1 + return n + else + if fib_array[n - 1] == 0 + fib_array[n - 1] = fibonacci(n - 1) + end + if fib_array[n - 2] == 0 + fib_array[n - 2] = fibonacci(n - 2) + end + end + + fib_array[n] = fib_array[n - 2] + fib_array[n - 1] + return fib_array[n] end diff --git a/lib/super_digit.rb b/lib/super_digit.rb index 33e367f..cf984a6 100644 --- a/lib/super_digit.rb +++ b/lib/super_digit.rb @@ -1,15 +1,22 @@ # Superdigit -# Time Complexity - ? -# Space Complexity - ? +# Time Complexity - O(n) +# Space Complexity - O(n) def super_digit(n) - -end + return n if n < 10 + sum = 0 + while n > 0 + sum += n % 10 + n /= 10 + end + + return super_digit(sum) +end + -# Time Complexity - ? -# Space Complexity - ? +# Time Complexity - Is this O(2^n) (exponential), because the method gets called twice each time? +# Space Complexity - Is this O(2^n) (exponential), because the method gets called twice each time? def refined_super_digit(n, k) - + return super_digit(super_digit(n) * k) end - \ No newline at end of file diff --git a/test/super_digit_test.rb b/test/super_digit_test.rb index 60da3a1..8eb6475 100644 --- a/test/super_digit_test.rb +++ b/test/super_digit_test.rb @@ -1,6 +1,6 @@ require_relative "test_helper" -xdescribe "super_digit" do +describe "super_digit" do it "will return 2 for super_digit(9875)" do # Act answer = super_digit(9875)