Я пытаюсь заполнить массив в соответствии с последовательностью Коллатца. Ограничения для последовательности следующие:
положительные целые числа:
n → n / 2 (n четно)
n → 3n + 1 (n нечетное)
Пример вывода
3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1
В идеале я хотел создать рекурсивный вызов, который заполнял бы массив в соответствии с ограничениями последовательности. Однако я считаю, что моя логика рекурсивного вызова крайне ошибочна. Предполагаемое поведение - перебирать вложенный массив, манипулируя только последним элементом каждого подмассива, пока элемент не достигнет 1. Я пытаюсь понять рекурсию и буду признателен за любые предложения по устранению этой проблемы.
def collatzSum(maxNumber)
sequenceHash = Hash.new(0)
i = maxNumber
until i == 0 do
if i.even?
sequenceHash[i] = [(i), (i / 2)]
elsif i.odd? && i != 1
sequenceHash[i] = [(i), (3 * i + 1)]
elsif i == 1
sequenceHash[i] = [i]
end
i -= 1
end
p sequenceHash
рекурсия helper_method. Метод должен принимать хеш-значения и выполнять итерацию в соответствии с операторами if.
=begin
desired output
hash = {5=>[5,16, 8, 4, 2,1],
4=>[4,2,1],
3=>[3,10,5,16,8,4,2,1],
2=>[2,1],
1=>[1]}
=end
Код:
collatzChain = lambda do |k|
j = 0
k = j[-1]
until k == 1 do
if k.even?
sequenceHash[k] << (k / 2)
elsif k.odd?
sequenceHash[k] << (3 * k + 1)
end
end
j += 1
end
collatzChain.call(sequenceHash.values)
sequenceHash
end
collatzSum(5)