我不明白这个“如果”声明有什么问题

时间:2014-11-27 01:25:49

标签: ruby

我有一个简单的程序,我不明白是什么问题。

(1..100).each do|i|
  if(i%3 == 0)
    puts "Fizz"
  elsif(i%5 == 0)
    puts "Buzz"
  elsif((i%5 == 0) && (i%3 == 0))
    puts "FizzBuzz"
  else
    puts "#{i}"
  end
end

除了5和3都能分割的数字外,一切正常。

当我运行程序时,我得到了

1,2,Fizz,4,Buzz,.......,14,Fizz,...

有什么问题?

4 个答案:

答案 0 :(得分:1)

如果它可以被3和5整除,则较早的if / elsif会捕获它。该行不应该是elsif,应该是if,或者您需要在各个部分之前对其进行测试。

基本上,逻辑流程不正确。

答案 1 :(得分:1)

每个可以用5和3整除的数字,请注意它们首先使条件if (i%3 == 0)为真。因此永远不会输入elsif((i%5 == 0) && (i%3 == 0))

一个简单的解决方法是首先检查((i%5 == 0) && (i%3 == 0))

答案 2 :(得分:1)

您误解了一旦满足if中的条件,就不会检查其余条件。

一种聪明的方法是在这种情况下使用mod 15,如:

(1..100).each do|i|
  if(i%15 == 0)
     puts "FizzBuzz"
  elsif(i%3 == 0)
    puts "Fizz"
  elsif(i%5 == 0)
    puts "Buzz"
  else
    puts "#{i}"
  end
end

答案 3 :(得分:0)

有一种更直接的方法,无需检查所有情况。

创建一个数组并将结果字符串放在那里。

  • 如果该数字可被3整除,则将Fizz附加到数组中。
  • 如果数字可被5整除,请将Buzz附加到数组中。
    • 请注意,如果我们有一个可被3 5整除的数字,我们会将Fizz和Buzz附加到数组中。
  • 如果我们没有向阵列推送任何内容,请添加数字。
  • 加入数组的所有元素并打印出来。

这是一个片段。

def fizzbuzz
  (1..100).each do|i|
    r = []
    if(i % 3 == 0)
      r << "Fizz"
    end
    if(i % 5 == 0)
      r << "Buzz"
    end
    if r.empty?
      r << i
    end
    puts r.join
  end
end