gpt4 book ai didi

ruby - 为什么这会导致无限循环?

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:58 24 4
gpt4 key购买 nike

我有一个简单的程序,我想输入一个数字,然后迭代地应用两个规则之一,使数字降为 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 之间交替。这是怎么发生的?谢谢!

最佳答案

问题是你计算了两次@number。修改也可能发生两次。

让我们看看数字为 2 时的情况:

@number = self.half if @number.even?

2 是偶数,所以减半。 @number 现在是 1。

但是随后,第二行执行。

@number = self.triple_plus_one if @number.odd?

@number 现在是奇数,所以它变成了 3*1 + 1。你看,可怜的 @number 永远无法稳定在 1 上。

要解决这个问题,您需要检查一次号码。然后做一个修改。

def hotpo
if @number.even?
@number = half
else
@number = triple_plus_one
end
end

或更短的形式

def hotpo
@number = @number.even? ? half : triple_plus_one
end

关于ruby - 为什么这会导致无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19798107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com