2

我对使用 Ruby 通过 Proj Euler 进行编程和工作是全新的。为什么这个红宝石循环不会中断?

(1..5).each do |a|
  (1..5).each do |b|
    e=(a*a)+(b*b)
    c=Math.sqrt(e)
    puts "a=#{a}, b=#{b}, c=#{c}"
    break if a+b+c == 12
  end
end

请注意,如果我在 if 语句中添加了任何其他内容(如果 a+b+c == 12 则说 puts "found it"),它工作得很好,它不会中断

4

3 回答 3

3

这很正常,因为你只能break从循环上b。(循环继续进行a


这个问题描述了正确的方法:How to break outer cycle in ruby

于 2013-04-10T07:05:12.363 回答
1

下面的代码可能是你想做的

(1..5).each do |a|
  break unless (1..5).each do |b|
    e=(a*a)+(b*b)
    c=Math.sqrt(e)
    puts "a=#{a}, b=#{b}, c=#{c}"
    break if a+b+c == 12
  end
end

当循环中触发了break时,循环的返回值变成了break值,就是nil这种情况。在其他情况下,(1..5)返回。所以这段代码可以工作。

于 2013-04-10T07:26:24.900 回答
1

正如其他人所说,break只会结束内部循环。

您可以重写您的代码,例如:

[*1..5].product([*1..5]).map{|a, b| [a, b, Math.sqrt(a*a+b*b)]}.each do |a, b, c|
    puts "a=#{a}, b=#{b}, c=#{c}"
    break if a + b + c == 12
end

现在,break将按您的预期工作。

于 2013-04-10T07:27:38.740 回答