Ruby中的项目Euler#6(有什么区别?)

时间:2015-06-17 04:56:53

标签: ruby algorithm math

我使用两种不同的方法为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

2 个答案:

答案 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