2013-04-10 57 views
1

我是通過Proj Euler和Ruby編程和工作的全新品牌。爲什麼不會這個紅寶石循環休息?如果爲什麼這個紅寶石每個循環都不會中斷?

(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),它工作得很好,它只是不會打破

+0

它位於內部範圍循環中並打破該外部循環,但外部循環將繼續。 – squiguy 2013-04-10 07:05:04

+2

可能重複[如何在Ruby中打破外部循環?](http://stackoverflow.com/questions/1352120/how-to-break-outer-cycle-in-ruby) – pduersteler 2013-04-10 07:05:55

+0

你的問題很混亂。你爲什麼要在終端上運行你的代碼?相反,您可以在這裏輸出結果,並從輸出中詢問您發現的意外行爲,以及預期的輸出結果。 – 2013-04-10 07:09:09

回答

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 

時休息什麼在循環中觸發,循環的返回值變爲中斷值,在這種情況下爲nil。在其他情況下,返回(1..5)。所以這段代碼將起作用。

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如你預期會工作。