找到100以下任何数字的最长的collat​​z序列

时间:2014-03-21 18:03:17

标签: ruby algorithm

def longest_collatz_sequence(n)
    longest_sequence = []
    (1..n).each do |a|
        sequence = [a]
        until sequence.last == 1
            if a % 2 == 0
                sequence.push(a/2)
            else
                sequence.push(3 * a + 1)
            end
        end
        if sequence.length > longest_sequence.length
            longest_sequence = sequence
        end
    end
    longest_sequence
end

longest_collat​​z_sequence(n)适用于n = 2,但不适用于n> 2.我做错了什么? 谢谢!

1 个答案:

答案 0 :(得分:3)

您总是推送相同的号码,a/23*a + 1,显然,如果a/2 != 1 != 3*a + 1,它永远不会停止。您可能希望使用最后一个序列而不是a

if sequence.last % 2 == 0
  sequence.push(sequence.last/2)
else
  sequence.push(3 * sequence.last + 1)
end

irb> longest_collatz_sequence(3)
=> [3, 10, 5, 16, 8, 4, 2, 1]

可以使用调试器或在适当的位置引入打印语句来跟踪这些类型的错误,以便您可以跟踪程序中发生的情况。我认为这可能会帮助你在将来帮助自己,因为不是所有的错误都很容易通过视觉检查找到。