diff --git a/algorithm b/algorithm new file mode 100644 index 0000000..2d346a2 --- /dev/null +++ b/algorithm @@ -0,0 +1,16 @@ +def square_of_two(n) + if n == 0 + return 1 + end + temp = square_of_two(n / 2) + if n % 2 == 0 + return temp * temp + elsif n % 2 == 1 + return 2 * temp * temp + end +end + +p square_of_two(2) +p square_of_two(4) +p square_of_two(5) +p square_of_two(0) \ No newline at end of file diff --git a/lib/recursive-methods.rb b/lib/recursive-methods.rb index fbf6faa..f02f763 100644 --- a/lib/recursive-methods.rb +++ b/lib/recursive-methods.rb @@ -1,49 +1,108 @@ # 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" + if n < 0 + raise ArgumentError + end + if n == 0 + return 1 + else + return n * factorial(n - 1) + end end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n) def reverse(s) - raise NotImplementedError, "Method not implemented" + if s.empty? + return "" + end + if s.length == 1 + return s[0] + else + return s[s.length - 1] + reverse(s[0..s.length - 2]) + end +end + +# Time complexity: O(n) +# Space complexity: O(1) +def reverse!(s, b, e) + if b >= e + return + else + temp = s[b] + s[b] = s[e] + s[e] = temp + reverse!(s, b + 1, e - 1) + end end -# Time complexity: ? -# Space complexity: ? def reverse_inplace(s) - raise NotImplementedError, "Method not implemented" + if s.empty? + return "" + end + if s.length == 1 + return s[0] + end + b = 0 + e = s.length - 1 + reverse!(s, b, e) end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n) def bunny(n) - raise NotImplementedError, "Method not implemented" + if n == 0 + return 0 + else + return 2 + bunny(n - 1) + end end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n) def nested(s) - raise NotImplementedError, "Method not implemented" + if s.length == 0 + return true + elsif s.length == 1 + return false + end + return s[0] == "(" && s[s.length - 1] == ")" && nested(s[1..s.length - 2]) end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n) def search(array, value) - raise NotImplementedError, "Method not implemented" + if array.empty? + return false + end + if array[0] == value + return true + else + return search(array[1..array.length - 1], value) + end end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n) def is_palindrome(s) - raise NotImplementedError, "Method not implemented" + if s.length <= 1 + return true + end + return s[0] == s[s.length - 1] && is_palindrome(s[1..s.length - 2]) end # Time complexity: ? # Space complexity: ? def digit_match(n, m) - raise NotImplementedError, "Method not implemented" -end \ No newline at end of file + if m == 0 || n == 0 + return 0 + end + if m % 10 == n % 10 + return digit_match(n / 10, m / 10) + 1 + else + return digit_match(n / 10, m / 10) + 0 + end +end diff --git a/specs/recursion_writing_spec.rb b/specs/recursion_writing_spec.rb index d8fb1ed..ba5258f 100644 --- a/specs/recursion_writing_spec.rb +++ b/specs/recursion_writing_spec.rb @@ -1,7 +1,7 @@ -require 'minitest/autorun' -require 'minitest/reporters' +require "minitest/autorun" +require "minitest/reporters" require "minitest/skip_dsl" -require_relative '../lib/recursive-methods' +require_relative "../lib/recursive-methods" describe "factorial" do it "will find the factorial of 0" do @@ -23,8 +23,7 @@ answer = factorial(num) # Assert - expect(answer).must_equal 5*4*3*2*1 - + expect(answer).must_equal 5 * 4 * 3 * 2 * 1 end it "will raise an ArgumentError if given a number not >= 0" do @@ -38,7 +37,7 @@ end end -xdescribe "reverse" do +describe "reverse" do it "will reverse 'cat'" do # Arrange string = "cat" @@ -83,17 +82,16 @@ end end - -xdescribe "reverse_in_place" do +describe "reverse_in_place" do it "will reverse 'cat'" do # Arrange string = "cat" # Act - answer = reverse_inplace(string) + reverse_inplace(string) # Assert - expect(answer).must_equal "tac" + expect(string).must_equal "tac" end it "will reverse 'a'" do @@ -122,14 +120,14 @@ string = "apple" # Act - answer = reverse_inplace(string) + reverse_inplace(string) # Assert - expect(answer).must_equal "elppa" + expect(string).must_equal "elppa" end end -xdescribe "bunny" do +describe "bunny" do it "returns 0 for 0 bunnies" do # Arrange count = 0 @@ -164,7 +162,7 @@ end end -xdescribe "nested" do +describe "nested" do it "will return true for empystring" do # Arrange string = "" @@ -210,7 +208,7 @@ end end -xdescribe "search" do +describe "search" do it "will return false for empty array" do # Arrange item = "a" @@ -224,43 +222,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 = "" @@ -295,7 +293,7 @@ end end -xdescribe "digit_match" do +describe "digit_match" do it "returns 4 for 1072503891 and 62530841" do # Arrange num1 = 1072503891 @@ -304,8 +302,8 @@ # Act answer = digit_match(num1, num2) - # Assert - expect(answer).must_equal 4 + # Assert + expect(answer).must_equal 4 end it "returns 0 for nonmatching numbers" do @@ -316,8 +314,8 @@ # Act answer = digit_match(num1, num2) - # Assert - expect(answer).must_equal 0 + # Assert + expect(answer).must_equal 0 end it "returns 3 for 841 and 62530841" do @@ -328,7 +326,7 @@ # Act answer = digit_match(num1, num2) - # Assert - expect(answer).must_equal 3 + # Assert + expect(answer).must_equal 3 end -end \ No newline at end of file +end