Ruby while循环只执行一次

时间:2014-04-23 23:31:47

标签: ruby math while-loop

此代码无效。我正在尝试对Collat​​z猜想进行编码,但代码似乎只为输入8运行一次。它打印出4,1,1,因此显示它只运行一步。 else块也从未执行过。有人能告诉我这个Ruby代码有什么问题吗?我不知道它为什么没有按照预期的方式工作。

class Collatz
    def collatz(number)
      if number == 1
         return 0
      end
      steps = 0
      while number > 1 do
         if number % 2 == 0 
           number = number / 2
           puts number
           steps = steps + 1
           puts steps
         else
           number = (number * 3) + 1
           puts number
           steps = steps + 1
           puts steps
      end  
      return steps
    end
end

steps = Collatz.new.collatz(8)
puts steps
end

2 个答案:

答案 0 :(得分:1)

你有一个return语句,它在while循环的第一次迭代后终止执行。

尝试

class Collatz
  def collatz(number)
    return 0 if number == 1

    steps = 0
    while number > 1 do
      if number % 2 == 0
        puts number /= 2
        puts steps += 1
      else
        number = (number * 3) + 1
        puts number
        puts steps += 1
      end
    end

    return steps
  end
end

steps = Collatz.new.collatz(8)
puts steps

返回3并打印

4
1
2
2
1
3

[Finished in 0.4s]

如果你想让你的代码变得更清洁,更具惯用性,你可以按如下方式重构:

class Collatz
  def collatz(number)
    return 0 if number == 1

    steps = 0
    while number > 1
      number = number.even? ? number / 2 : (number * 3) + 1
      puts number, steps += 1
    end

    steps
  end
end

steps = Collatz.new.collatz(8)
#4
#1
#2
#2
#1
#3
#=> 3

答案 1 :(得分:0)

让我们正确缩进您的代码,看看我们是否能找到问题:

class Collatz
  def collatz(number)
    if number == 1
      return 0
    end
    steps = 0
    while number > 1 do
      if number % 2 == 0 
        number = number / 2
        puts number
        steps = steps + 1
        puts steps
      else
        number = (number * 3) + 1
        puts number
        steps = steps + 1
        puts steps
      end  
      return steps
    end
  end
  steps = Collatz.new.collatz(8)
  puts steps
end

看一下 - return在你的while循环中,所以它在第一次迭代结束时返回。看起来你真的想在上面的那一行结束你的while循环。

这就是为什么编码风格非常重要的原因之一。它可以诱骗你认为你的代码意味着它没有。