数値を取り込んで、2 つのルールのいずれかを反復的に適用して数値を 1 に減らし、そこに到達するまでにかかった反復回数を追跡する単純なプログラムがあります。
ルールは簡単です: (正の整数 n の場合) n --> n/2 (n は偶数) n --> 3n+1 (n は奇数)
これを達成するために私が書いたコード:
class Collatz
attr_accessor :number, :counter
def initialize(number)
@number = number
@counter = 0
end
def collatz
until (@number == 1) do
self.hotpo
@counter += 1
end
end
def hotpo
@number = self.half if @number.even?
@number = self.triple_plus_one if @number.odd?
end
def half
@number / 2
end
def triple_plus_one
(3 * @number) + 1
end
end
num = Collatz.new(13)
puts num.number #==> 13
puts num.counter #==> 0
num.collatz #currently results in infinite loop
puts num.number #should give 1
puts num.counter #should give 9
たとえば、オブジェクトをインスタンス化して 13 を渡すと、@number は 13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1 に変化し、終了します。 、しかし、現在 @number=2 と @number=4 を交互に繰り返す無限ループに陥っています。これはどのように起こっているのでしょうか? ありがとう!