Ruby 意外的$end after while循环和嵌套if

Ruby 意外的$end after while循环和嵌套if,ruby,Ruby,我有一个我正在做的程序,它应该是求前1000个素数的和。目前,我所关心的是确保程序能够找到前1000个素数,我将在以后添加添加这些素数的功能。以下是我所拥有的: #!/usr/bin/ruby def prime(num) is_prime = true for i in 2..Math.sqrt(num) if (num % i) == 0 is_prime = false else

我有一个我正在做的程序,它应该是求前1000个素数的和。目前,我所关心的是确保程序能够找到前1000个素数,我将在以后添加添加这些素数的功能。以下是我所拥有的:

#!/usr/bin/ruby

def prime(num)

    is_prime = true

    for i in 2..Math.sqrt(num)

        if (num % i) == 0           
            is_prime = false
        else
            is_prime = true
        end
    end

    return is_prime
end


i = 2
number_of_primes = 0

while number_of_primes < 1000

    prime = prime(i)

    if prime == true
        number_of_primes++

    end
    i++
end

有什么好处?任何方向都值得赞赏

Ruby没有
++
操作符,您需要执行
+=1

number_of_primes += 1

Ruby没有
++
操作符,您需要执行
+=1

number_of_primes += 1

未经询问,但如果您感兴趣,请提供几条建议:

Ruby最酷的一点是,问号在方法名中是合法的。因此,您经常会发现“predicate”方法(测试某些内容并返回true或false的方法)以问号结尾,例如:
odd?
。您的
prime
方法非常适合于此,因此我们可以将其重命名为
prime?

你可以使用一个局部变量,
is_prime
,来判断你是否找到了你正在测试的数字的一个因子——这是你在java或C这样的命令式语言中应该做的事情——但是Ruby具有函数式编程的各种很酷的特性,你可以通过学习获得强大的功能和表达能力。如果您以前没有遇到过它们,您可能需要在google上搜索什么是
块以及语法是如何工作的,但是出于这个目的,您可以将其视为在集合的每个项目上运行一些代码的一种方式。它可以与多种很酷的方法一起使用,其中一种方法非常适合您的目的:
none?
,如果在集合中没有调用它的项,则返回true,当传递到您给出的代码块时,返回true。因此您的
prime?
方法可以这样重写:

def prime? num
  (2..Math.sqrt(num)).none? { |x| num % x == 0 }
end
除了较短之外,不需要使用局部变量(如
is_prime
)的优点是,引入错误的机会较少-例如,如果您认为
is_prime
的内容是一回事,但实际上是另一回事。如果你仔细看的话,它也更接近质数的实际数学定义。因此,通过删除不必要的代码,您可以更接近于暴露您所写内容的“意义”

就获得前1000个素数而言,无限流是一种非常酷的方法,但这里的解释可能有点复杂-如果你感兴趣,肯定是谷歌,因为它们真的很棒!但是出于兴趣,这里有一个简单的方法,你可以使用递归而不使用局部变量(记住局部变量是魔鬼!)

就总结而言,我要说的就是搜索一个名为
inject
——也称为
reduce
的ruby方法。如果你以前没有接触过这个概念,一开始可能会有点大脑弯曲,但这很值得学习!非常酷,非常强大


玩得开心

未经询问,但如果您感兴趣,请提供几条建议:

Ruby最酷的一点是,问号在方法名中是合法的。因此,您经常会发现“predicate”方法(测试某些内容并返回true或false的方法)以问号结尾,例如:
odd?
。您的
prime
方法非常适合于此,因此我们可以将其重命名为
prime?

你可以使用一个局部变量,
is_prime
,来判断你是否找到了你正在测试的数字的一个因子——这是你在java或C这样的命令式语言中应该做的事情——但是Ruby具有函数式编程的各种很酷的特性,你可以通过学习获得强大的功能和表达能力。如果您以前没有遇到过它们,您可能需要在google上搜索什么是
块以及语法是如何工作的,但是出于这个目的,您可以将其视为在集合的每个项目上运行一些代码的一种方式。它可以与多种很酷的方法一起使用,其中一种方法非常适合您的目的:
none?
,如果在集合中没有调用它的项,则返回true,当传递到您给出的代码块时,返回true。因此您的
prime?
方法可以这样重写:

def prime? num
  (2..Math.sqrt(num)).none? { |x| num % x == 0 }
end
除了较短之外,不需要使用局部变量(如
is_prime
)的优点是,引入错误的机会较少-例如,如果您认为
is_prime
的内容是一回事,但实际上是另一回事。如果你仔细看的话,它也更接近质数的实际数学定义。因此,通过删除不必要的代码,您可以更接近于暴露您所写内容的“意义”

就获得前1000个素数而言,无限流是一种非常酷的方法,但这里的解释可能有点复杂-如果你感兴趣,肯定是谷歌,因为它们真的很棒!但是出于兴趣,这里有一个简单的方法,你可以使用递归而不使用局部变量(记住局部变量是魔鬼!)

就总结而言,我要说的就是搜索一个名为
inject
——也称为
reduce
的ruby方法。如果你以前没有接触过这个概念,一开始可能会有点大脑弯曲,但这很值得学习!非常酷,非常强大


玩得开心

ruby不懂“++”。。使用素数的个数+=1 Ruby不理解“++”。。使用素数+=1一些建议,我很感谢您的回复。我肯定会更深入地研究。我是ruby语言的新手,到目前为止,这是一次有趣的学习经历,所以很高兴看到一些ruby可以做的事情,而Java却做不到。太好了,很高兴能提供帮助!你用Ruby选了一门好语言。非常有趣