diff --git a/DIRECTORY.md b/DIRECTORY.md index 69c7685..1051e25 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -88,6 +88,7 @@ * [Pascal Triangle Ii](https://github.com/TheAlgorithms/Ruby/blob/master/dynamic_programming/pascal_triangle_ii.rb) ## Maths + * [3N Plus 1 or Collatz Conjecture](https://github.com/TheAlgorithms/Ruby/blob/master/maths/3nPlus1.rb) * [Abs](https://github.com/TheAlgorithms/Ruby/blob/master/maths/abs.rb) * [Abs Max](https://github.com/TheAlgorithms/Ruby/blob/master/maths/abs_max.rb) * [Abs Min](https://github.com/TheAlgorithms/Ruby/blob/master/maths/abs_min.rb) diff --git a/maths/3nPlus1.rb b/maths/3nPlus1.rb new file mode 100644 index 0000000..083cdd5 --- /dev/null +++ b/maths/3nPlus1.rb @@ -0,0 +1,44 @@ +# A ruby program for 3N plus 1 +# 3N plus 1 is also called as Collatz Conjecture +# +# f(n) => n / 2 (if n = 0 (mod 2)) +# f(n) => (3n + 1) (if n = 1 (mod 2)) +# +# Wiki: https://en.wikipedia.org/wiki/Collatz_conjecture + +def collatz_conjecture(number) + n = number + nums = [] + nums.push(number) + + while number > 1 + if number.even? + number /= 2 + nums.push(number) + else + number = 3 * number + 1 + nums.push(number) + end + end + + "The 3N + 1 series of #{n} is #{nums}." +rescue StandardError + 'Error: Please provide number only!' +end + +# Valid inputs +puts collatz_conjecture(12) +# The 3N + 1 series of 12 is [12, 6, 3, 10, 5, 16, 8, 4, 2, 1]. + +puts collatz_conjecture(6) +# The 3N + 1 series of 6 is [6, 3, 10, 5, 16, 8, 4, 2, 1]. + +puts collatz_conjecture(100) +# The 3N + 1 series of 100 is [100, 50, 25, 76, 38, 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]. + +# Invalid inputs +puts collatz_conjecture('12') +# Error: Please provide number only! + +puts collatz_conjecture('a') +# Error: Please provide number only!