我编写了以下函数来检查数字是否为素数:
def is_prime?(number)
arr = (2..number).to_a.select {|m| number % m == 0}
arr.length == 1 ? true : false
end
当传递4或9作为irb中的数字时,它正确地返回false。然而,在回复中,这些评估结果为真。
这是我在repl.it:上运行的测试代码
puts("nTests for #is_prime?")
puts("===============================================")
puts('is_prime?(2) == true: ' + (is_prime?(2) == true).to_s)
puts('is_prime?(3) == true: ' + (is_prime?(3) == true).to_s)
puts('is_prime?(4) == false: ' + (is_prime?(4) == false).to_s)
puts('is_prime?(9) == false: ' + (is_prime?(9) == false).to_s)
puts("===============================================")
其输出:
Tests for #is_prime?
===============================================
is_prime?(2) == true: true
is_prime?(3) == true: true
is_prime?(4) == false: true
is_prime?(9) == false: true
===============================================
What could be causing this variation?
我尝试了repl.it,结果4和9都为false。
无论如何,对代码的两个小改进是:-您可以直接在范围上调用select
,而无需在数组中调用它-您可以返回表达式本身的值,而不指定true和false
def is_prime?(number)
arr = (2..number).select {|m| number % m == 0}
arr.length == 1
end
您对测试的输出感到困惑,该输出报告了函数的预期结果和函数的实际结果是正确的(即测试预期的结果(:
is_prime?(2) == true: true
is_prime?(3) == true: true
is_prime?(4) == false: true
is_prime?(9) == false: true
^ ^
| |
| true if the test passed; false if failed
|
What the function should have returned
如果最右边的列包含所有"true"值,则该函数已通过所有测试。