2010-07-11 75 views
1

我想寫一個Rubyish解決方案來解決Project Euler中的問題6,因爲我傾向於用其他語言編寫C語言。然而,這段代碼:語法錯誤,期待「=」

sqrsum, sumsqr = 0, 0 
(1..100).each { |x| sqrsum, sumsqr += x, x**2 } 
p (sumsqr - (sqrsum ** 2)) 

踢了這些錯誤:

/Users/Andy/Documents/Programming/Ruby/ProjectEuler/P6.rb:2: syntax error, unexpected tOP_ASGN, expecting '=' 
(1..100).each { |x| sqrsum, sumsqr += x, x**2 } 
                                     ^ 
/Users/Andy/Documents/Programming/Ruby/ProjectEuler/P6.rb:2: syntax error, unexpected tPOW, expecting '=' 
(1..100).each { |x| sqrsum, sumsqr += x, x**2 } 
                                            ^ 

我在做什麼錯在這裏?我只允許以該句法結構進行分配嗎?

回答

3

您正在嘗試進行多次分配,但不使用賦值運算符=。 將sqrsum, sumsqr = 0, 0sqrsum, sumsqr += x, x**2進行比較。可能您想寫sqrsum, sumsqr = sqrsum+x, sumsqr+x**2

+0

對不起,我還是不明白爲什麼我的版本(您的答案中的第二個代碼片段)無效。 – Andy 2010-07-11 02:05:32

+1

=可以做多項分配,+ =不能 – 2010-07-11 02:08:36

+0

@尼爾,謝謝。 – Andy 2010-07-11 02:42:26

1

你想要的

sqrsum,sumsqr = sumsqr + X,X ** 2

+0

你的回答是最接近的。原來,我真正想要的是 'sqrsum,sumsqr = sumsqr + x,sqrsum + x ** 2' – Andy 2010-07-11 02:07:22

2

爲什麼不只是做{ |x| sqrsum += x; sumsqr += x**2}

+0

因爲我不知道我可以! +1 – Andy 2010-07-11 02:42:01

+0

是的,紅寶石中的分號基本上就是一個換行符,允許你在一行上執行多個命令 – 2010-07-11 15:14:35

2

你也可以使用inject

sqrsum, sumsqr = (1..100).inject(:+), (1..100).inject(0) { |result,x| result + x**2 } 
p(sumsqr - sqrsum**2) 

[編輯:感謝您指出評議:+速記]

+0

我喜歡這種方法,但是你的例子不起作用。你能幫我理解爲什麼嗎? – Andy 2010-07-11 02:51:57

+0

哦!我想到了!它應該是'| result,x |',而不是相反。萬歲的文檔。 :) – Andy 2010-07-11 03:00:13

+0

總和也可以寫成'(1..100).inject(&:+)' – 2010-07-11 08:29:32

相關問題