Straight up brute force was too slow, so I would store the sequence counts for numbers I’d already seen in a hash table.
The following iterative sequence is defined for the set of positive integers:
n → n/2 (n is even)
n → 3n + 1 (n is odd)Which starting number, under one million, produces the longest chain?
def advance heap, n, count
if heap.has_key? n
return heap[n] + count
end
if (n & 1) == 0
return advance(heap, n / 2, count + 1)
end
advance(heap, 3 * n + 1, count + 1)
end
heap = Hash[0,0,1,1]
answer, max = 1, 1
1_000_000.times do |i|
heap[i] = advance(heap, i, 1)
if heap[i] > max
max = heap[i]
answer = i
end
end
puts answer