2013-05-02 101 views
1

意外的$结束我有这个程序,我正在努力,应该找到前1000个素数的总和。目前我所关心的是确保程序找到前1000个素数,我将添加稍后添加它们的功能。这里是我有:while循环和嵌套如果

#!/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 

当我尝试运行该程序,我得到以下回馈:

sumOfPrimes.rb:32: syntax error, unexpected keyword_end 
sumOfPrimes.rb:34: syntax error, unexpected keyword_end 

怎么办?任何方向表示赞赏。

+4

红宝石不明白'++'.. use number_of_primes + = 1 – 2013-05-02 18:50:46

回答

10

Ruby没有++运营商,你需要做的+= 1

number_of_primes += 1 
+0

哇...我觉得自己像个白痴。谢谢你,那是什么 – ndland 2013-05-02 18:51:15

+0

为什么它没有这样一个共同的运营商?我必须花40分钟来计算我的'如果'和'结束' – 2016-11-01 14:26:26

1

未受请求的,但建议几块如果你有兴趣:

一个关于Ruby很酷的事情问题标记在方法名称中是合法的。因此,您经常会发现'predicate'方法(测试某些内容并返回true或false的方法)以问号结束,如下所示:odd?。您的prime方法非常适合您,因此我们可以将其重命名为prime?

您可以使用本地变量is_prime来确定您是否找到了要测试的数字的因素 - 这是您期望在命令式语言中执行的一种操作,例如java或C - 但Ruby具有功能性编程的各种酷炫功能,您将通过学习获得强大的功能和表现力。如果你以前没有碰到过,你可能需要谷歌什么block以及语法是如何工作的,但是为了这个目的,你可以把它想象成一种在集合中的每个项目上运行一些代码的方法。它可以与各种酷方法一起使用,其中一个非常适合您的目的:none?,如果在传递给您提供的代码块时未调用集合中的项目,则返回true,并返回true。所以,你的prime?方法可以写成这样:

def prime? num 
    (2..Math.sqrt(num)).none? { |x| num % x == 0 } 
end 

除了是较短,不需要使用本地变量,如is_prime的好处是,你给自己机会少,引入错误 - 例如,如果你想is_prime的内容是一回事,但它实际上是另一回事。同样,如果仔细观察,则更接近质数的实际数学定义。因此,通过删除不必要的代码,您可以更接近地暴露您正在编写的内容的“含义”。

至于获得前1000个素数去,无限流是这样做一个非常酷的方式,但可能是一个有点复杂在这里解释 - 如果你有兴趣,因为他们真的是惊人的肯定谷歌!但是,只是出于兴趣,这里有一个简单的方法,你可以只用递归和任何局部变量做到这一点(记住局部变量是魔鬼!):

def first_n_primes(i = 2, primes = [], n) 
    if primes.count == n then primes 
    elsif prime? i then first_n_primes(i + 1, primes + [i], n) 
    else first_n_primes(i + 1, primes, n) 
    end 
end 

并尽可能总结起来去所有我会说是有一个叫做inject的红宝石方法的搜索 - 也叫reduce。如果你之前没有遇到过这个概念,这可能有点让人费解,但它非常值得学习!非常酷,非常强大。

玩得开心!

+0

令人敬畏的建议,我很欣赏这种回应。绝对是我会更多关注的东西。我对ruby语言是全新的,到目前为止它已经是一种有趣的学习体验,所以很高兴看到您能够用Ruby做的一些事情,而您在Java中看不到这些。 – ndland 2013-05-02 23:47:27

+0

太棒了,很高兴有帮助!你在Ruby中选择了一种好语言。很多乐趣在等待着。 – Russell 2013-05-03 06:05:25