尝试编写经典的脑筋急转弯储物柜问题(打开/关闭100个储物柜)。当我运行我写的代码时,它没有给出10个打开的储物柜的正确答案,而是显示所有储物柜都是关闭的。我想我在我的loops...any建议中遗漏了什么?谢谢。
def lockerproblem
j = 0
lockers = []
while j < 100
lockers << "open"
j += 1
end
a = 1
i = 0
while a <= 100
while i < 100
if ( i + 1 ) % a == 0
if lockers[i] == "open"
lockers[i] = "closed"
else
lockers[i] = "open"
end
end
i += 1
end
a += 1
end
lockers[3] = "open"
lockers.each do |text|
puts text
end
end
lockerproblem发布于 2013-04-03 04:41:26
对于数组初始化,请考虑以下内容:
lockers = ["open"] * 100考虑一下您的i变量:它什么时候设置为0?这对内部循环意味着什么?例如,
a, b = 0, 0
while a < 2
while b < 2
puts "a=#{a}, b=#{b}"
b += 1
end
a += 1
end输出:
a=0, b=0
a=0, b=1换句话说,你看不到:
a=0, b=0
a=0, b=1
a=1, b=0
a=1, b=1为什么?因为b递增到2,所以永远不会重置,并且内部循环只执行一次。也许您在错误的位置设置了i的初始值,其中“错误”意味着“在外部循环之外”。
最后,打开第四个储物箱(locker[3])将抛出结果。
有一些小的调整可以使代码更容易理解(见鬼,我甚至可以为了这个小示例的目的在String上定义一个open?方法),但这应该足以让你得到你期望的答案。
这样的补丁并不总是一个好主意,特别是在Ruby内部。但是它允许一些简单和漂亮的东西,比如:
> lockers.find_all(&:closed?).size
=> 10发布于 2013-04-03 05:07:14
您可以通过进行三个更改来获得正确的答案:
i需要在每次迭代开始时重置为0 aclosedlockers[3] = "open" lockers[3] = "open"启动
更新后的代码:
def lockerproblem
j = 0
lockers = []
while j < 100
lockers << "closed"
j += 1
end
a = 1
i = 0
while a <= 100
i = 0
while i < 100
if ( i + 1 ) % a == 0
if lockers[i] == "open"
lockers[i] = "closed"
else
lockers[i] = "open"
end
end
i += 1
end
a += 1
end
lockers.each do |text|
puts text
end
end
lockerproblemhttps://stackoverflow.com/questions/15773729
复制相似问题