From db896611ec9b9fea3485238170ee9956cc9ab411 Mon Sep 17 00:00:00 2001 From: Maha-ElMais Date: Sun, 24 Jan 2021 12:13:09 -0800 Subject: [PATCH] recursive methods --- .idea/.gitignore | 6 ++ .idea/inspectionProfiles/Project_Default.xml | 6 ++ .idea/misc.xml | 4 + .idea/modules.xml | 8 ++ .idea/recursion-writing.iml | 27 ++++++ .idea/vcs.xml | 6 ++ Gemfile.lock | 36 ++++++++ lib/recursive-methods.rb | 89 +++++++++++++++----- test/recursion_writing_test.rb | 8 +- 9 files changed, 164 insertions(+), 26 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/recursion-writing.iml create mode 100644 .idea/vcs.xml create mode 100644 Gemfile.lock diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..8bf4d45 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,6 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..b0db9b0 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..510e7fc --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..8457255 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/recursion-writing.iml b/.idea/recursion-writing.iml new file mode 100644 index 0000000..a1a27da --- /dev/null +++ b/.idea/recursion-writing.iml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file 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..5a4e543 100644 --- a/lib/recursive-methods.rb +++ b/lib/recursive-methods.rb @@ -3,47 +3,92 @@ # Time complexity: ? # Space complexity: ? def factorial(n) - raise NotImplementedError, "Method not implemented" + raise ArgumentError if n < 0 + if n == 0 + return 1 + else + return n * factorial(n-1) + end end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n^2) +# Space complexity: O(n^2) def reverse(s) - raise NotImplementedError, "Method not implemented" + if s.length <= 1 + return s + end + reverse_s = reverse(s[1..-1]) + reverse_s += s[0] + + return reverse_s end -# Time complexity: ? -# Space complexity: ? -def reverse_inplace(s) - raise NotImplementedError, "Method not implemented" +# Time complexity: O(n) +# Space complexity: O(n) +def reverse_inplace(s, first = 0, last = s.length-1) + + if s.length == 0 || s.length == 1 + return s + end + + return s if first >= last + temp = s[first] + s[first] = s[last] + s[last] = temp + + return reverse_inplace(s, first + 1, last - 1) + 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^2) +# Space complexity: O(n^2) def nested(s) - raise NotImplementedError, "Method not implemented" + return true if s == "" + return false if s[0] != "(" || s[-1] != ")" + return nested(s[1...-1]) end -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) +# Space complexity: O(n) def search(array, value) - raise NotImplementedError, "Method not implemented" + return false if array.length == 0 + return true if array[0] == value + return search(array[1..-1], value) + end -# Time complexity: ? -# Space complexity: ? -def is_palindrome(s) - raise NotImplementedError, "Method not implemented" +# Time complexity: O(n) +# Space complexity: O(n) +def is_palindrome(s, first = 0,last = s.length-1) + + return true if s.empty? || first >= last + return false if s[first] != s[last] + + return is_palindrome(s, first + 1, last - 1) + end # Time complexity: ? # Space complexity: ? def digit_match(n, m) - raise NotImplementedError, "Method not implemented" + return 1 if n == 0 && m == 0 + return 0 if n <= 1 || m <= 1 + if n % 10 == m % 10 + return 1 + digit_match(n / 10, m / 10) + else + return digit_match(n / 10, m / 10) + end +end + +def fibonacci(n) + return 0 if n == 0 + return 1 if n == 1 + return fibonacci(n - 1) + fibonacci(n - 2) end \ No newline at end of file diff --git a/test/recursion_writing_test.rb b/test/recursion_writing_test.rb index 3b30725..4984dad 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" @@ -263,7 +263,7 @@ 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