The Collatz Conjecture or 3x+1 problem can be summarized as follows:
Take any positive integer n. If n is even, divide n by 2 to get n / 2. If n is odd, multiply n by 3 and add 1 to get 3n + 1. Repeat the process indefinitely. The conjecture states that no matter which number you start with, you will always reach 1 eventually.
Given a number n, return the number of steps required to reach 1.
Starting with n = 12, the steps would be as follows:
Resulting in 9 steps. So for input n = 12, the return value would be 9.
To run the tests, run the command
busted from within the exercise directory.
For more detailed information about the Lua track, including how to get help if you're having trouble, please visit the exercism.io Lua language page.
An unsolved problem in mathematics named after mathematician Lothar Collatz https://en.wikipedia.org/wiki/3x_%2B_1_problem
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
local conjecture = require('collatz-conjecture') describe('collatz-conjecture', function() it('zero steps for one', function() assert.are.equal(0, conjecture(1)) end) it('divide if even', function() assert.are.equal(4, conjecture(16)) end) it('even and odd steps', function() assert.are.equal(9, conjecture(12)) end) it('large number of even and odd steps', function() assert.are.equal(152, conjecture(1000000)) end) it('zero is an error', function() assert.has_error( function() conjecture(0) end, 'Only positive numbers are allowed' ) end) it('negative value is an error', function() assert.has_error( function() conjecture(-15) end, 'Only positive numbers are allowed' ) end) end)
local collatz_conjecture -- iterative collatz_conjecture = function (n) if n <= 0 then error('Only positive numbers are allowed') end local steps = 0 while n > 1 do if n % 2 == 0 then n = n / 2 else n = 3 * n + 1 end steps = steps + 1 end return steps end -- recursive collatz_conjecture = function (n, steps) steps = steps or 0 if n <= 0 then error('Only positive numbers are allowed') elseif n == 1 then return steps elseif n % 2 == 0 then return collatz_conjecture(n / 2, steps + 1) else return collatz_conjecture(3 * n + 1, steps + 1) end end return collatz_conjecture
A huge amount can be learned from reading other people’s code. This is why we wanted to give exercism users the option of making their solutions public.
Here are some questions to help you reflect on this solution and learn the most from it.