A local variable cannot take a scope beyond a method definition. Use an instance variable instead.
@test_array = []
def collatz_sequence(number)
return 1 if number == 1
@test_array << number
collatz_sequence(number.even? ? number / 2 : 3 * number + 1)
end
collatz_sequence(13) # => 1
@test_array # => [13, 40, 20, 10, 5, 16, 8, 4, 2]
But I don't see much point in returning 1 at the end. Including that in @test_array
makes more sense:
@test_array = []
def collatz_sequence(number)
@test_array << number
collatz_sequence(number.even? ? number / 2 : 3 * number + 1) unless number == 1
end
collatz_sequence(13)
@test_array # => [13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
But this is not a good practice because the array and the procedure of the method have dependency. A better way to do it is:
def collatz_sequence(number, test_array = [])
return if number == 1
collatz_sequence(number.even? ? number / 2 : 3 * number + 1, test_array)
end
collatz_sequence(13)