2010-07-11 51 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

相关问题