From 46abc278326a46048cba37e441d618e59ba13449 Mon Sep 17 00:00:00 2001 From: Anya Tokar <61166946+anyatokar@users.noreply.github.com> Date: Mon, 2 Nov 2020 22:43:45 -0800 Subject: [PATCH] completed with time and space O(n)s --- Gemfile.lock | 36 +++++++++++++ lib/recursive-methods.rb | 73 ++++++++++++++++--------- test/recursion_writing_test.rb | 99 ++++++++++++++++++++++++---------- 3 files changed, 156 insertions(+), 52 deletions(-) create mode 100644 Gemfile.lock diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..630ea95 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,36 @@ +GEM + remote: https://rubygems.org/ + specs: + ansi (1.5.0) + builder (3.2.4) + coderay (1.1.3) + method_source (1.0.0) + minitest (5.14.2) + minitest-reporters (1.4.2) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + minitest-skip (0.0.3) + minitest (~> 5.0) + minitest-spec (0.0.2.1) + minitest (>= 3.0) + pry (0.13.1) + coderay (~> 1.1) + method_source (~> 1.0) + rake (13.0.1) + ruby-progressbar (1.10.1) + +PLATFORMS + ruby + +DEPENDENCIES + minitest + minitest-reporters + minitest-skip + minitest-spec + pry + rake + +BUNDLED WITH + 2.1.4 diff --git a/lib/recursive-methods.rb b/lib/recursive-methods.rb index fbf6faa..180da77 100644 --- a/lib/recursive-methods.rb +++ b/lib/recursive-methods.rb @@ -1,49 +1,74 @@ # 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^2) def factorial(n) - raise NotImplementedError, "Method not implemented" + return raise ArgumentError if n < 0 + return 1 if n == 0 || n == 1 + return n * factorial(n-1) end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n^2) def reverse(s) - raise NotImplementedError, "Method not implemented" + return s if s.length <= 1 + reverse_s = reverse(s[1..-1]) + reverse_s += s[0] + return reverse_s end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n^2) def reverse_inplace(s) - raise NotImplementedError, "Method not implemented" + return s if s.length <= 1 + n = s[-1] + reverse_inplace(s[1..-2]) + s[0] + s.replace n # I don't know how to reverse in place without using .replace... end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n) def bunny(n) - raise NotImplementedError, "Method not implemented" + return n if n == 0 + return 2 + bunny(n-1) end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n^2) def nested(s) - raise NotImplementedError, "Method not implemented" + return true if s.length == 0 + return false unless s[0] == "(" && s[-1] == ")" + return nested(s[1..-2]) end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n^2) def search(array, value) - raise NotImplementedError, "Method not implemented" + return false if array == [] + return true if array[0] == value + return search(array[1..-1], value) end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n^2) def is_palindrome(s) - raise NotImplementedError, "Method not implemented" + return true if s == "" + return false unless s[0] == s[-1] + return is_palindrome(s[1..-2]) +end + +# Time complexity: O(n) +# Space complexity: O(n^2) +def helper_digit_match(n_string, m_string, matches) + return matches if n_string[-1].nil? || n_string[-1].nil? + if n_string[-1] == m_string[-1] + helper_digit_match(n_string[0..-2], m_string[0..-2], matches += 1) + else + helper_digit_match(n_string[0..-2], m_string[0..-2], matches) + end end -# Time complexity: ? -# Space complexity: ? def digit_match(n, m) - raise NotImplementedError, "Method not implemented" + n_string = n.to_s + m_string = m.to_s + return helper_digit_match(n_string, m_string, 0) end \ No newline at end of file diff --git a/test/recursion_writing_test.rb b/test/recursion_writing_test.rb index 3b30725..62ab381 100644 --- a/test/recursion_writing_test.rb +++ b/test/recursion_writing_test.rb @@ -167,7 +167,7 @@ end end -xdescribe "nested" do +describe "nested" do it "will return true for empystring" do # Arrange string = "" @@ -213,7 +213,7 @@ end end -xdescribe "search" do +describe "search" do it "will return false for empty array" do # Arrange item = "a" @@ -227,43 +227,43 @@ end it "will return true when looking for something in the array" do - # Arrange - item = "a" - array = ["b", "c", "a"] + # Arrange + item = "a" + array = ["b", "c", "a"] - # Act - answer = search(array, item) + # Act + answer = search(array, item) - # Assert - expect(answer).must_equal true + # Assert + expect(answer).must_equal true end it "will return false when looking for something not in the array" do # Arrange item = "x" array = ["b", "c", "a"] - + # Act answer = search(array, item) - + # Assert expect(answer).must_equal false - end - - it "will return true when finding something at the front of the array" do - # Arrange - item = "b" - array = ["b", "c", "a"] - - # Act - answer = search(array, item) - - # Assert - expect(answer).must_equal true - end + end + + it "will return true when finding something at the front of the array" do + # Arrange + item = "b" + array = ["b", "c", "a"] + + # Act + answer = search(array, item) + + # Assert + expect(answer).must_equal true + end end -xdescribe "is_palindrome" do +describe "is_palindrome" do it "will return true for emptystring" do # Arrange string = "" @@ -298,7 +298,7 @@ end end -xdescribe "digit_match" do +describe "digit_match" do it "returns 4 for 1072503891 and 62530841" do # Arrange num1 = 1072503891 @@ -334,7 +334,7 @@ # Assert expect(answer).must_equal 3 end - + it "returns 1 for (0, 0)" do # Arrange num1 = 0 @@ -346,7 +346,7 @@ # Assert expect(answer).must_equal 1 end - + it "returns 1 for (10, 20)" do # Arrange num1 = 10 @@ -359,3 +359,46 @@ expect(answer).must_equal 1 end end + + + +# Sam's reverse in line tests + +describe "reverse_in_place" do + it "will reverse 'cat'" do + # Arrange + string = "cat" + # Act + answer = reverse_inplace(string) + # Assert + expect(answer).must_equal "tac" + expect(string).must_equal(answer) + end + it "will reverse 'a'" do + # Arrange + string = "a" + # Act + answer = reverse_inplace(string) + # Assert + expect(answer).must_equal "a" + expect(string).must_equal(answer) + end + it "will reverse empty string " do + # Arrange + string = "" + # Act + answer = reverse_inplace(string) + # Assert + expect(answer).must_equal "" + expect(string).must_equal(answer) + end + it "will reverse 'apple'" do + # Arrange + string = "apple" + # Act + answer = reverse_inplace(string) + # Assert + expect(answer).must_equal "elppa" + expect(string).must_equal(answer) + end +end \ No newline at end of file