2014-02-23 138 views
0

我正在重新完成迄今爲止在Ruby中完成的18個Euler挑戰,我喜歡它。不幸的是,我犯了一些初學者的錯誤,無法弄清楚我做錯了什麼。具體來說,下面的代碼有什麼問題?我嘗試添加400萬以下的所有斐波納契數字。我的while循環有什麼問題?

start = Time.now 

def sum_fibonacci_till_4_million 
    previous_previous_value = 1 
    previous_value = 2 
    i = 2 
    fibo = Array.new 

    while previous_value < 4000000 do 
     fibo.push(previous_previous_value) 
     fibo.push(previous_value) 

     temp = previous_value 
     previous_value = previous_value + previous_previous_value 
     previous_previous_value = temp 

     i++ 
    end 

    return fibo.inject(:+) 
end 

puts "The answer is #{sum_fibonacci_till_4_million()} and it took #{(start - Time.now) 
* 1000} milliseconds." 

我得到的輸出是

2.rb:22: syntax error, unexpected keyword_end 
2.rb:27: syntax error, unexpected $end, expecting keyword_end 
...ime.now) * 1000} milliseconds." 
...  

我以前有過這樣的錯誤,我設法用一個for循環解決它。但是,我的結尾語句顯然有些問題。我不知道。

有人可以幫我嗎?

+1

當你有這樣的一般語法錯誤時,你可以使用分而治之的方法來找到它。首先你可能註釋掉'while/end'循環。沒有更多的語法錯誤!接下來註釋掉'while/end'循環中的行。沒有錯誤。最終,當'i ++'被註釋掉時,你會發現沒有語法錯誤。作爲'i.class => Fixnum',檢查'Fixnum'文檔。沒有':++'方法!它可以在'Fixnum.ancestors'中的其中一個類中嗎? 'Fixnum.instance_methods.include?(:++)=> false'說'不'。但爲什麼沒有':++'方法? Google「Ruby i ++」。 PS你應該顯示'require'time''。 –

回答

7

i++在紅寶石中是不允許的。寫i += 1

Ruby has no pre/post increment/decrement operator。例如,x ++或x--將無法解析。更重要的是,++ x或--x將無能爲力!實際上,它們表現爲多個一元前綴運算符:-x == --- x == ----- x == ......要增加一個數字,只需寫入x + = 1。

[ruby-talk:18951] Re: notes from a Ruby newbie - blade

|沒有後置或前置增量或減量運算符!

不是。因爲我不能給他們面向對象的語義。他們將基本上是任務。

+0

啊有趣。爲什麼不? –

+7

@ user2609980因爲它沒有。 –

+0

@ user2609980 -1。如果你只是問爲什麼Ruby沒有'++'和'--',那麼這可能是有意義的,但使用一些不存在的東西很簡單。它不是寫在文件的任何地方,這種東西存在。你爲什麼認爲Ruby有它?你很sl。。這就像隨機地將一些希臘文字混合成一個英文句子,並問「爲什麼這個句子不被理解?」 – sawa