【问题标题】:Method involving a conditional loop is unexpectedly returning nil for some values涉及条件循环的方法对某些值意外返回 nil
【发布时间】:2019-07-17 19:13:14
【问题描述】:

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

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

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

我还测试了 43 (true) 和 100 和 80 (nil)。我还注意到,如果我用 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

【问题讨论】:

  • 注意:Ruby 是一种区分大小写的语言,大写字母在语法方面具有特定的含义。变量和方法名称应该是小写字母。大写字母表示ClassNameCONSTANT_NAME 形式的常量。
  • 大概是避免使用Ruby的Prime模块吧?
  • 如果您可以使用Prime 方法,那就是:require 'prime'; Prime.prime?(n),其中n 是随机选择的整数(可能为非正数)。
  • 提示:素数不能被从 2 到数字本身平方根的任何数字整除。 Ruby 中有一个“数学”库,它有 Math.sqrt(number) 来获取数字的平方根。
  • 负数不是素数(也不是自然数)。

标签: ruby


【解决方案1】:

您的问题是 until 循环的主体并不总是运行:

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

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

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

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

almost_num_absolute == increasing_divisor

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

【讨论】:

  • 好的,我在increasing_divisor += 1 行之后结束了循环,并根据该循环的结果开始了一个新的条件。该方法现在提供了正确的结果
  • @IvoEvansStorrie 好的。如果问题得到解决,请随时接受答案。
猜你喜欢
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
相关资源
最近更新 更多