2013-05-02 112 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