我使用两种不同的方法为Project Euler解决了#6,但第二种恰好是巧合。我真的不明白为什么我不必像我为第一种方法那样返回new_sum的平方。有谁知道这两者之间的主要区别是什么?
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
答案 0 :(得分:2)
&&
的优先级高于+=
的优先级。所以这些表达方式:
sum += num**2 && new_sum += num
new_sum += num && sum += num**2
不按预期工作。第一个只是发生来提供看似正确的"正确的"结果
将它们划分为不同的行,您将看到不同之处。或者,至少使用and
代替&&
。 and
的优先级低于+=
的优先级。
答案 1 :(得分: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)
这是&&
运算符的结果,它具有更高的优先级(如Yu Hao所指出的)并返回第一个值,该值确定是否满足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