3

数値を取り込んで、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 を交互に繰り返す無限ループに陥っています。これはどのように起こっているのでしょうか? ありがとう!

4

1 に答える 1