【问题标题】:Finding a prime number using a **custom** Ruby method使用 **custom** Ruby 方法查找素数
【发布时间】:2013-12-09 19:32:39
【问题描述】:

我想将numbers 的数组传递给我的is_prime? 方法并返回数字是否有效。我不想使用:

require 'prime'
a = [1,2,3,4,5]
Hash[a.zip(a.map(&Prime.method(:prime?)))]

这是学习经验。我当前的代码只输出数组中的第一个数字。有人可以帮我理解我做错了什么吗?谢谢!

def is_prime?(*nums)
i = 2
    nums.each do |num|
        while i < num
            is_divisible = ((num % i) == 0)
                if is_divisible == false
                    x = "#{num}: is NOT a prime number." #false
               else
                    x = "#{num}: is a prime number." #true
                end

            i +=1   
        end
        return x
    end
end

puts is_prime?(27,13,42)

【问题讨论】:

  • 每个循环中都有一个return 语句。它总是会退出循环。另外,您的is_divisible 语句没有意义,为什么将布尔值存储在变量中然后对其进行测试?只需将 num % i == 0 移动到您的 if 语句条件中。
  • @HunterMcMillen 谢谢我已经按照你的建议更新了代码,但是逻辑仍然不正确,因为我没有得到想要的输出。还有其他建议吗?谢谢。

标签: ruby


【解决方案1】:

你正在循环中返回。

您的方法中存在一些错误:

def is_prime?(*nums)
   nums.each do |num|
      return false if num == 1
      next if num == 2 # 2 is the only even prime
      i = 2  # needs to be reset for each num
      while i < num 
        return false if num % i == 0  # num is not prime
        i += 1   
      end
   end
   true # We'll reach here only if all the numbers are prime
end

【讨论】:

  • ROFL! rohit89 为您带来轻松的业力!
  • 如果我将return 移出循环。它返回未定义。此外,代码似乎总是返回false
  • 如果所有数字都是素数,您希望该方法返回 true,否则返回 false?
  • 是的,这就是我想要做的。
  • 您的代码仅返回array 中的first 索引。 您的编辑也给出了相同的结果。
【解决方案2】:

这将以与您使用主库相同的格式返回您的结果,并与您的自定义函数具有相同的逻辑:

def is_prime?(*nums)
  nums.each_with_object({}) do |num, hsh|
    hsh[num] = num > 1 && 2.upto(num - 1).none? { |i| num % i == 0 }
  end
end

puts is_prime?(27,13,42)
# => {27=>false, 13=>true, 42=>false}

既然你提到这只是为了学习,我假设你知道 sieve 是比暴力迭代更好的方法。

如果您想了解上述代码的工作原理或进一步帮助理解您当前的代码为何不工作,请在 cmets 中告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2011-11-18
    • 1970-01-01
    • 2014-05-28
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多