2015-06-17 20 views
0

我使用两种不同的方法解决了项目Euler的#6问题,但第二个恰巧巧合。我不明白为什么我不必为我的第一个方法返回new_sum的平方。有谁知道两者之间的主要区别是什么?Ruby中的Euler#6项目(有什么区别?)

def square_difference(num) 
    new_sum = 0 
    sum = 0 
    while num >= 1 
    sum += num**2 && new_sum += num 
    num -= 1 
    end 
    return new_sum**2 - sum 
end 

def square_difference(num) 
    new_sum = 0 
    sum = 0 
    while num >= 1 
    new_sum += num && sum += num**2 
    num -= 1 
    end 
    return new_sum - sum 
end 
+1

我期待downvotes和投票结束是因为你没有告诉读者什么“项目欧拉#6”是什么。我建议你编辑并解释问题是什么。同时给出一个预期产出的简单数值例子也是有帮助的。一旦读者理解你要完成的是什么,分析你提出的两种方法应该相当简单。 –

+0

你也可以计算如下:'num = 5; sum,sum_sq =(1..num).reduce([0,0]){| (sum,sum_sq),n | [sum + n,sum_sq + n * n]}; sum * sum - sum_sq#=> 170'。 –

回答

2

&&的优先级比的+=高。所以这些表达式:

sum += num**2 && new_sum += num 

new_sum += num && sum += num**2 

不按预期工作。第一个只是发生提供看似“正确”的结果。

将它们分成不同的行,你会看到不同之处。或者,至少使用and而不是&&and的优先级低于+=

+0

好的。最后一行也有所不同,尽管这可能是一个错字。 –

+0

@CarySwoveland我在第一种方法中解决了[Project Euler#6](https://projecteuler.net/problem=6):)第二种方法的'new_sum'与'new_sum ** 2'具有相同的值,这就是为什么OP很混乱,所以最后一行可能不是拼写错误。 –

+0

@CarySwoveland'square_difference(10)'的正确结果是问题描述中的'2640'。用OP的代码,这两种方法似乎都有相同的正确结果。 OP认为这两种方法的主体应该具有相同的指令,但返回值除外。这就是混淆来自何处,为什么第二种方法在第一种方法没有返回'new_sum ** 2 - sum'时给出了正确的结果?所以我告诉OP,由于'&&'的优先级,这两个方法没有相同的指令。分离陈述是展示代码如何工作的方式。 –

1

两个公式都有相同的细微错误。我经历了几次,以了解发生了什么。

从第二个:

[30] pry(main)> square_difference(4) 
new_sum: 16, sum: 16, num: 3 
new_sum: 41, sum: 25, num: 2 
new_sum: 70, sum: 29, num: 1 
new_sum: 100, sum: 30, num: 0 
=> 70 

我们可以看到,new_sum似乎并没有被表现如预期。

什么是实际发生的是,new_sum += num && sum += num**2被评估为new_sum += (num && sum += num **2),进而计算为new_sum += (sum += num **2)

这是&&运营商,它具有更高的优先级(如俞灏指出的)并返回的结果确定AND条件是否满足的第一个值。

[31] pry(main)> 2 && 2 
=> 2 
[32] pry(main)> 2 && 4 
=> 4 
[33] pry(main)> 4 && 2 
=> 2 
[34] pry(main)> nil && 2 
=> nil 
[35] pry(main)> 2 && nil 
=> nil 
相关问题