此代码无效。我正在尝试对Collatz猜想进行编码,但代码似乎只为输入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
答案 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循环。
这就是为什么编码风格非常重要的原因之一。它可以诱骗你认为你的代码意味着它没有。