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/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..68a9416 100644
--- a/lib/recursive-methods.rb
+++ b/lib/recursive-methods.rb
@@ -1,49 +1,91 @@
# Authoring recursive algorithms. Add comments including time and space complexity for each method.
-# Time complexity: ?
-# Space complexity: ?
+# Time complexity: O(n) it depends on the size of n to run
+# Space complexity: O(n) it creates a stack every time it calls the recursive method
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: ?
+# Time complexity: O(n^2) - the slice method in the reverse method creates another array so that counts for O(n) and then the method runs n times depending on the size of array, O(n). Total of O(n^2).
+# Space complexity: O(n^2) - because we are creating a new array when using the slice method and it creates a stack to run the recursion method.
def reverse(s)
- raise NotImplementedError, "Method not implemented"
+ if s.length <= 1
+ return s
+ end
+
+ return s[-1] + reverse(s[1..-2]) + s[0]
end
-# Time complexity: ?
-# Space complexity: ?
-def reverse_inplace(s)
- raise NotImplementedError, "Method not implemented"
+
+# Time complexity: O(n) it depends on the size of s to run
+# Space complexity: O(n) it creates a stack every time if calls the recursive method
+def reverse_inplace(s, i = 0, j = s.length - 1)
+ return s if s.length == 0 || s.length == 1
+ return s if i >= j
+ temp = s[i]
+ s[i] = s[j]
+ s[j] = temp
+
+ return reverse_inplace(s, i + 1, j - 1)
end
-# Time complexity: ?
-# Space complexity: ?
+
+# Time complexity: O(n) it depends on the size of n to run
+# Space complexity: O(n) it creates a stack every time if calls the recursive method
def bunny(n)
- raise NotImplementedError, "Method not implemented"
+ return 0 if n <= 0
+ return 2 + bunny(n - 1)
end
-# Time complexity: ?
-# Space complexity: ?
-def nested(s)
- raise NotImplementedError, "Method not implemented"
+# Time complexity: O(n) it depends on the size of s to run
+# Space complexity: O(n) it creates a stack every time if calls the recursive method
+def nested(s, i = 0, j = s.length - 1)
+ return true if s.empty? || i > j && s[i] != s[j]
+ return false if s.length == 1 || s[i] == s[j]
+ return nested(s, i + 1, j - 1)
+
end
-# Time complexity: ?
-# Space complexity: ?
-def search(array, value)
- raise NotImplementedError, "Method not implemented"
+# Time complexity: O(n) it depends on the size of the array to run
+# Space complexity: O(n) it creates a stack every time if calls the recursive method
+def search(array, value, index = 0)
+ return false if index >= array.length
+ return true if array[index] == value
+ return search(array, value, index + 1)
end
-# Time complexity: ?
-# Space complexity: ?
-def is_palindrome(s)
- raise NotImplementedError, "Method not implemented"
+# Time complexity: O(n) it depends on the size of s to run
+# Space complexity: O(n) it creates a stack every time if calls the recursive method
+def is_palindrome(s, i = 0, j = s.length - 1)
+ return true if s.empty? || i >= j
+ return false if s[i] != s[j]
+
+ return is_palindrome(s, i + 1, j - 1)
end
-# Time complexity: ?
-# Space complexity: ?
+# Time complexity: O(log n)
+# Space complexity: O(log n)
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
+
+
+
+# Time complexity: O(2^n) it depends on the size of n to run
+# Space complexity: O(2^n) it creates a stack every time if calls the recursive method
+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..fde7481 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
@@ -359,3 +359,30 @@
expect(answer).must_equal 1
end
end
+
+describe "fib" do
+ it "returns 0 for fib(0)" do
+ n = 0
+ answer = fibonacci(n)
+ expect(answer).must_equal 0
+ end
+
+ it "returns 1 for fibonnaci(1)" do
+
+ n = 1
+ answer = fibonacci(n)
+ expect(answer).must_equal 1
+ end
+
+ it "returns 3 for fibonnaci(4)" do
+ n = 4
+ answer = fibonacci(n)
+ expect(answer).must_equal 3
+ end
+
+ it "returns 34 for (9)" do
+ n = 9
+ answer = fibonacci(n)
+ expect(answer).must_equal 34
+ end
+end