From 6b925f9dd445c81ead007d8d17ce6098eac85aea Mon Sep 17 00:00:00 2001 From: Janice Lichtman Date: Tue, 28 Mar 2017 07:57:11 -0700 Subject: [PATCH 1/3] wrote methods for #1-3 --- README.md | 1 + recursive-methods.rb | 81 ++++++++++++++++++++++++++++++++------------ sandbox.rb | 12 +++++++ 3 files changed, 72 insertions(+), 22 deletions(-) create mode 100644 sandbox.rb diff --git a/README.md b/README.md index dd66f4c..5d066eb 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ Write a method `factorial` that accepts an integer parameter n and that uses rec - e.g. fact(4) = 4 * 3 * 2 * 1 = 24 + ### Write #2 `reverse(s)` Write a method `reverse` that accepts a string as a parameter diff --git a/recursive-methods.rb b/recursive-methods.rb index 7daaac0..92d700e 100644 --- a/recursive-methods.rb +++ b/recursive-methods.rb @@ -1,34 +1,71 @@ def factorial(n) + raise ArgumentError.new("Not an integer") if + !(n.class==Integer) + raise ArgumentError.new("Not a positive integer") if n < 0 + if n==0 + return 1 + else + return n * factorial(n-1) + end end -def reverse(s) -end -def bunny(n) -end +#with tail recursion (just for fun): +def factorialB(n, total=1) + raise ArgumentError.new("Not an integer") if + !(n.class==Integer) + raise ArgumentError.new("Not a positive integer") if n < 0 -def nested(s) + if n==0 + return total + else + return factorialB(n-1, n * total) + end end -# Factorial Tests -raise "factorial broke - factorial(4)" unless factorial(4) == 24 -raise "factorial broke - factorial(0)" unless factorial(0) == 1 -puts "passes all factorial tests" -# Reverse Tests -raise "reverse broke - reverse('hello world')" unless reverse("hello world") == "dlrow olleh" -raise "reverse broke - reverse('a b c')" unless reverse("a b c") == "c b a" -puts "passes all reverse tests" +def reverse(s) + if s.nil? || s.length==0 + return "" + else + return reverse(s[1..-1])+s[0] + end +end -# Bunny Tests -raise "bunny broke - bunny(0)" unless bunny(0) == 0 -raise "bunny broke - bunny(10)" unless bunny(10) == 20 -puts "passes all bunny tests" +def bunny(n) + raise ArgumentError.new("Not an integer") if + !(n.class==Integer) + raise ArgumentError.new("Not a positive integer") if n < 0 -# Nested Tests -raise "nested broke - nested('((()))')" unless reverse("((()))") == true -raise "nested broke - nested('())')" unless reverse("())") == false -puts "passes all nested tests" + if n==0 + return 0 + else + return bunny(n-1) + 2 + end +end -puts "All test passed" +# def nested(s) +# end +# +# # Factorial Tests +# raise "factorial broke - factorial(4)" unless factorial(4) == 24 +# raise "factorial broke - factorial(0)" unless factorial(0) == 1 +# puts "passes all factorial tests" +# +# # Reverse Tests +# raise "reverse broke - reverse('hello world')" unless reverse("hello world") == "dlrow olleh" +# raise "reverse broke - reverse('a b c')" unless reverse("a b c") == "c b a" +# puts "passes all reverse tests" +# +# # Bunny Tests +# raise "bunny broke - bunny(0)" unless bunny(0) == 0 +# raise "bunny broke - bunny(10)" unless bunny(10) == 20 +# puts "passes all bunny tests" +# +# # Nested Tests +# raise "nested broke - nested('((()))')" unless reverse("((()))") == true +# raise "nested broke - nested('())')" unless reverse("())") == false +# puts "passes all nested tests" +# +# puts "All test passed" diff --git a/sandbox.rb b/sandbox.rb new file mode 100644 index 0000000..d6849e4 --- /dev/null +++ b/sandbox.rb @@ -0,0 +1,12 @@ + +def factorial(n) + raise ArgumentError.new("Not an integer") if + !(n.class==Integer) + raise ArgumentError.new("Not a positive integer") if n < 0 + + if n==0 + return 1 + else + return n * factorial(n-1) + end +end From d0b93b524232fdfdafe6eb043ba02a35ae0296df Mon Sep 17 00:00:00 2001 From: Janice Lichtman Date: Tue, 28 Mar 2017 22:27:58 -0700 Subject: [PATCH 2/3] wrote methods for palindromes and fibonacci --- recursive-methods.rb | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/recursive-methods.rb b/recursive-methods.rb index 92d700e..ae8e098 100644 --- a/recursive-methods.rb +++ b/recursive-methods.rb @@ -2,7 +2,7 @@ def factorial(n) raise ArgumentError.new("Not an integer") if !(n.class==Integer) - raise ArgumentError.new("Not a positive integer") if n < 0 + raise ArgumentError.new("Not a non-negative integer") if n < 0 if n==0 return 1 else @@ -15,7 +15,7 @@ def factorial(n) def factorialB(n, total=1) raise ArgumentError.new("Not an integer") if !(n.class==Integer) - raise ArgumentError.new("Not a positive integer") if n < 0 + raise ArgumentError.new("Not a non-negative integer") if n < 0 if n==0 return total @@ -36,8 +36,7 @@ def reverse(s) def bunny(n) raise ArgumentError.new("Not an integer") if !(n.class==Integer) - raise ArgumentError.new("Not a positive integer") if n < 0 - + raise ArgumentError.new("Not a non-negative integer") if n < 0 if n==0 return 0 else @@ -48,6 +47,35 @@ def bunny(n) # def nested(s) # end # + +def fib(n) + raise ArgumentError.new("Not an integer") if + !(n.class==Integer) + raise ArgumentError.new("Not a positive integer") if n < 0 + if n == 1 + return 1 + elsif n == 2 + return 1 + else + return fib(n-1) + fib(n-2) + end +end + +def pal(s) + if (s.length == 1) || (s.length == 0) + return true + elsif s[0] == s[-1] + return pal(s[1..-2]) + else + return false + end +end + + + + + + # # Factorial Tests # raise "factorial broke - factorial(4)" unless factorial(4) == 24 # raise "factorial broke - factorial(0)" unless factorial(0) == 1 From 6440a489e27b8a746ff8f22081a4b6f24e5a7dee Mon Sep 17 00:00:00 2001 From: Janice Lichtman Date: Wed, 29 Mar 2017 00:07:10 -0700 Subject: [PATCH 3/3] solved all problems --- recursive-methods.rb | 89 +++++++++++++++++++++++++++++++++----------- sandbox.rb | 29 ++++++++++----- 2 files changed, 88 insertions(+), 30 deletions(-) diff --git a/recursive-methods.rb b/recursive-methods.rb index ae8e098..46f62b7 100644 --- a/recursive-methods.rb +++ b/recursive-methods.rb @@ -33,6 +33,7 @@ def reverse(s) end end + def bunny(n) raise ArgumentError.new("Not an integer") if !(n.class==Integer) @@ -44,9 +45,54 @@ def bunny(n) end end -# def nested(s) -# end -# + +#Accepts ()() as acceptable 'nestings' of parentheses. +def nested(s, counter = 0) + s.each_char do |paren| + raise ArgumentError.new("Includes non-paren characters") if !['(',')'].include?(paren) + end + + if s.length == 0 + (counter == 0)? true:false + elsif s[0]=='(' + counter += 1 + return nested(s[1..-1], counter) + elsif s[0]==')' + counter -= 1 + if counter < 0 + return false + else + return nested(s[1..-1], counter) + end + end +end + + +# Only accepts strictly nested strings of parenteses. +# Ex ()() will count as false. +def strictly_nested(s, counter = 0) + s.each_char do |paren| + raise ArgumentError.new("Includes non-paren characters") if !['(',')'].include?(paren) + end + + if s.length == 0 + (counter == 0)? true:false + elsif s[0]=='(' + counter += 1 + return strictly_nested(s[1..-1], counter) + elsif s[0]==')' + counter -= 1 + #Since we only want strictly nested parentheses [ie don't want to allow ()() ], if counter hits 0 and there are more characters in the string, the method should return false. + if counter == 0 && s.length != 1 + return false + else + return strictly_nested(s[1..-1], counter) + end + end +end + + +####### Added Fun def fib(n) raise ArgumentError.new("Not an integer") if @@ -61,11 +107,12 @@ def fib(n) end end + def pal(s) if (s.length == 1) || (s.length == 0) return true elsif s[0] == s[-1] - return pal(s[1..-2]) + return pal(s[1..-2]) else return false end @@ -73,27 +120,27 @@ def pal(s) +# Factorial Tests +raise "factorial broke - factorial(4)" unless factorial(4) == 24 +raise "factorial broke - factorial(0)" unless factorial(0) == 1 +puts "passes all factorial tests" +# Reverse Tests +raise "reverse broke - reverse('hello world')" unless reverse("hello world") == "dlrow olleh" +raise "reverse broke - reverse('a b c')" unless reverse("a b c") == "c b a" +puts "passes all reverse tests" +# Bunny Tests +raise "bunny broke - bunny(0)" unless bunny(0) == 0 +raise "bunny broke - bunny(10)" unless bunny(10) == 20 +puts "passes all bunny tests" -# # Factorial Tests -# raise "factorial broke - factorial(4)" unless factorial(4) == 24 -# raise "factorial broke - factorial(0)" unless factorial(0) == 1 -# puts "passes all factorial tests" -# -# # Reverse Tests -# raise "reverse broke - reverse('hello world')" unless reverse("hello world") == "dlrow olleh" -# raise "reverse broke - reverse('a b c')" unless reverse("a b c") == "c b a" -# puts "passes all reverse tests" -# -# # Bunny Tests -# raise "bunny broke - bunny(0)" unless bunny(0) == 0 -# raise "bunny broke - bunny(10)" unless bunny(10) == 20 -# puts "passes all bunny tests" -# # # Nested Tests # raise "nested broke - nested('((()))')" unless reverse("((()))") == true # raise "nested broke - nested('())')" unless reverse("())") == false # puts "passes all nested tests" -# -# puts "All test passed" + +puts 'typo in the nested tests. written as reverse instead of nested' + + +puts "All test passed" diff --git a/sandbox.rb b/sandbox.rb index d6849e4..12c247d 100644 --- a/sandbox.rb +++ b/sandbox.rb @@ -1,12 +1,23 @@ +# Only accepts strictly nested strings of parenteses. +# Ex ()() will count as false. -def factorial(n) - raise ArgumentError.new("Not an integer") if - !(n.class==Integer) - raise ArgumentError.new("Not a positive integer") if n < 0 +def strictly_nested(s, counter = 0) + s.each_char do |paren| + raise ArgumentError.new("Includes non-paren characters") if !['(',')'].include?(paren) + end - if n==0 - return 1 - else - return n * factorial(n-1) - end + if s.length == 0 + (counter == 0)? true:false + elsif s[0]=='(' + counter += 1 + return strictly_nested(s[1..-1], counter) + elsif s[0]==')' + counter -= 1 + #Since we only want strictly nested parentheses [ie don't want to allow ()() ], if counter hits 0 and there are more characters in the string, the method should return false. + if counter == 0 && s.length != 1 + return false + else + return strictly_nested(s[1..-1], counter) + end + end end