diff --git a/lib/factorial.rb b/lib/factorial.rb index 6a4a408..d04b494 100644 --- a/lib/factorial.rb +++ b/lib/factorial.rb @@ -1,6 +1,16 @@ # Computes factorial of the input number and returns it -# Time complexity: ? -# Space complexity: ? +# Time complexity: O(n) where n is the number +# Space complexity: O(1) def factorial(number) - raise NotImplementedError + return 1 if number == 0 + return 1 if number == 1 + raise ArgumentError if number == nil + fact = 1 + index = 1 + while index < number + fact *= (index + 1) + index += 1 + end + + return fact end diff --git a/specs/factorial_spec.rb b/specs/factorial_spec.rb index de28055..89067ab 100644 --- a/specs/factorial_spec.rb +++ b/specs/factorial_spec.rb @@ -1,6 +1,6 @@ -require 'minitest/autorun' -require 'minitest/reporters' -require_relative '../lib/factorial' +require "minitest/autorun" +require "minitest/reporters" +require_relative "../lib/factorial" describe "factorial" do describe "basic tests" do @@ -8,6 +8,10 @@ factorial(5).must_equal 120 end + it "factorial(3) = 6" do + factorial(3).must_equal 6 + end + it "factorial(7) = 5040" do factorial(7).must_equal 5040 end @@ -17,7 +21,7 @@ describe "edge cases" do # if the parameter is an object, check for nil it "nil object is not an integer" do - proc {factorial(nil)}.must_raise ArgumentError + proc { factorial(nil) }.must_raise ArgumentError end it "factorial(0) = 1" do