diff --git a/lib/recursive-methods.rb b/lib/recursive-methods.rb index fbf6faa..181779d 100644 --- a/lib/recursive-methods.rb +++ b/lib/recursive-methods.rb @@ -1,49 +1,67 @@ # Authoring recursive algorithms. Add comments including time and space complexity for each method. -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n) def factorial(n) - raise NotImplementedError, "Method not implemented" + raise ArgumentError if n < 0 + return 1 if n == 0 + return n * factorial(n - 1) end -# Time complexity: ? -# Space complexity: ? -def reverse(s) - raise NotImplementedError, "Method not implemented" +# Time complexity: O(n), where n is the length of the string +# Space complexity: O(n), where n is the length of the string +def reverse(s, pointer = s.length - 1) + return s if s == "" + return s[pointer] if pointer == 0 + return s[pointer] + reverse(s, pointer - 1) end -# Time complexity: ? -# Space complexity: ? -def reverse_inplace(s) - raise NotImplementedError, "Method not implemented" +# Time complexity: O(n), where n is the length of the string. (More precisely, n/2) +# Space complexity: O(n), where n is the length of the string. (More precisely, n/2) +def reverse_inplace(s, start = 0, finish = s.length - 1) + return s[start] if start == finish + return "" if start > finish + return s[finish] + reverse_inplace(s, start + 1, finish - 1) + s[start] end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n) def bunny(n) - raise NotImplementedError, "Method not implemented" + return 0 if n < 1 + return 2 if n == 1 + return 2 + bunny(n - 1) end -# Time complexity: ? -# Space complexity: ? -def nested(s) - raise NotImplementedError, "Method not implemented" +# Time complexity: O(n), where n is the length of the string +# Space complexity: O(n), where n is the length of the string +def nested(s, parens_counter = 0, pointer = 0) + return false if parens_counter < 0 + return true if pointer == s.length && parens_counter == 0 + return false if pointer == s.length && parens_counter != 0 + return nested(s, parens_counter + 1, pointer + 1) if s[pointer] == "(" + return nested(s, parens_counter - 1, pointer + 1) if s[pointer] == ")" end -# Time complexity: ? -# Space complexity: ? -def search(array, value) - raise NotImplementedError, "Method not implemented" +# Time complexity: O(n), where n is the length of the string +# Space complexity: O(n), where n is the length of the string +def search(array, value, pointer = 0) + return false if pointer == array.length + return true if array[pointer] == value + return search(array, value, pointer + 1) end -# Time complexity: ? -# Space complexity: ? -def is_palindrome(s) - raise NotImplementedError, "Method not implemented" +# Time complexity: O(n), where n is the length of the string (More precisely, n/2) +# Space complexity: O(n), where n is the length of the string (More precisely, n/2) +def is_palindrome(s, length = s.length, pointer = 0) + return true if pointer > length / 2 + return false if s[pointer] != s[length - 1 - pointer] + return is_palindrome(s, length, pointer + 1) if s[pointer] == s[length - 1 - pointer] end -# Time complexity: ? -# Space complexity: ? -def digit_match(n, m) - raise NotImplementedError, "Method not implemented" +# Time complexity: O(n), where n is the length of the shorter string +# Space complexity: O(n), where n is the length of the shorter string +def digit_match(n, m, pointer = -1, matches = 0) + return matches if (pointer).abs > n.to_s.length || (pointer).abs > m.to_s.length + return digit_match(n, m, pointer - 1, matches + 1) if n.to_s[pointer] == m.to_s[pointer] + return digit_match(n, m, pointer - 1, matches) if n.to_s[pointer] != m.to_s[pointer] end \ No newline at end of file diff --git a/test/recursion_writing_test.rb b/test/recursion_writing_test.rb index 820810e..1361ca9 100644 --- a/test/recursion_writing_test.rb +++ b/test/recursion_writing_test.rb @@ -33,12 +33,12 @@ # Act-Assert expect { - answer = factorial(num) + factorial(num) }.must_raise ArgumentError end end -xdescribe "reverse" do +describe "reverse" do it "will reverse 'cat'" do # Arrange string = "cat" @@ -84,7 +84,7 @@ end -xdescribe "reverse_in_place" do +describe "reverse_in_place" do it "will reverse 'cat'" do # Arrange string = "cat" @@ -129,7 +129,7 @@ end end -xdescribe "bunny" do +describe "bunny" do it "returns 0 for 0 bunnies" do # Arrange count = 0 @@ -164,7 +164,7 @@ end end -xdescribe "nested" do +describe "nested" do it "will return true for empystring" do # Arrange string = "" @@ -210,7 +210,7 @@ end end -xdescribe "search" do +describe "search" do it "will return false for empty array" do # Arrange item = "a" @@ -260,7 +260,7 @@ end end -xdescribe "is_palindrome" do +describe "is_palindrome" do it "will return true for emptystring" do # Arrange string = "" @@ -295,7 +295,7 @@ end end -xdescribe "digit_match" do +describe "digit_match" do it "returns 4 for 1072503891 and 62530841" do # Arrange num1 = 1072503891