1

我正在尝试解决 Ruby挑战。目的是编写一个方法,如果作为参数输入的随机整数(包括负整数和 0)是素数,则返回 true,否则返回 false。我的方法在返回结果时返回正确的结果。

我已经测试了数字 1-20 的方法。它返回:

  • 对 20 以下的所有 7 个素数都为真,除了 3,它是 nil
  • 1、9 和 15 为假
  • 其他一切为零

我还测试了 43(真)和 100 和 80(无)。我还注意到,如果我用 return 注释掉这些行,该方法会为 1 到 20 之间的所有参数返回 nil。

这是方法:

def isPrime(num)
  num_absolute = num.abs
  increasing_divisor = 2
  almost_num_absolute = num_absolute - 1

  if num_absolute <=1
    return false
  elsif num_absolute == 2
    return true
  else
    until num_absolute % increasing_divisor == 0 || almost_num_absolute == increasing_divisor
      increasing_divisor += 1
      if num_absolute % increasing_divisor == 0
        return false
      elsif almost_num_absolute == increasing_divisor
        return true
      end
    end
  end
end
4

1 回答 1

1

你的问题是这个until循环的主体并不总是运行:

until num_absolute % increasing_divisor == 0 || almost_num_absolute == increasing_divisor

假设我传递了3. 这是一个素数,所以这个循环将一直运行 almost_num_absolute == increasing_divisor。此时块将完成,并且由于您的函数在块之后until没有指定任何返回值,它只会返回 nil (这是函数的“默认”返回值)。until

现在假设您传递了6. 的值为increasing_divisor2(起始值)。6 可以被 2 整除。因此,因为num_absolute % increasing_divisor == 0是 true,所以until块的主体永远不会运行。同样,在块之后没有指定返回值until,因此使用默认返回值(nil)。

一个快速的解决方法是在函数的末尾添加这一行(就在 final 之前end):

almost_num_absolute == increasing_divisor

由于素数和非素数都可以在代码中到达这一点,因此您需要在此处进行最后检查。如果almost_num_absolute == increasing_divisor是真的,那么你知道没有找到除数,因此结果素数

于 2019-07-17T21:09:03.937 回答