【问题标题】:Function to calculate the difference between sum of squares and square of sums计算平方和和平方和之间的差的函数
【发布时间】:2013-03-23 23:50:12
【问题描述】:

我正在尝试编写一个名为 sum_square_difference 的函数,它接受一个数字 n 并返回前 n 个自然数的平方和与其和的平方之间的差。

我想我知道如何编写一个定义平方和的函数

def sum_of_squares(numbers):
    total = 0
    for num in numbers:
        total += (num ** 2)
    return(total)

我已经尝试实现平方和函数:

def square_sum(numbers):  
    total = 0
    for each in range: 
        total = total + each
    return total**2

我不知道如何组合函数来区分,我不知道我的函数是否正确。

有什么建议吗?我正在使用 Python 3.3

谢谢。

【问题讨论】:

    标签: python sum


    【解决方案1】:

    这个函数可以用纯数学写成这样:

    翻译成Python:

    def square_sum_difference(n):
        return int((3*n**2 + 2*n) * (1 - n**2) / 12)
    

    该公式是其他两个公式的简化:

    def square_sum_difference(n):
        return int(n*(n+1)*(2*n+1)/6 - (n*(n+1)/2)**2)
    

    n*(n+1)*(2*n+1)/6here 描述的公式,它返回第一个n 自然数的平方和。

    (n*(n+1)/2))**2 使用三角数公式,它是第一个 n 自然数之和,然后平方。


    这也可以通过内置的sum 函数来完成。这里是:

    def sum_square_difference(n):
        r = range(1, n+1)  # first n natural numbers
        return sum(i**2 for i in r) - sum(r)**2
    

    range(1, n+1) 生成第一个 n 自然数的迭代器。

    >>> list(range(1, 4+1))
    [1, 2, 3, 4]
    

    sum(i**2 for i in r) 返回 r 中数字的平方和,sum(r)**2 返回 r 中数字和的平方。

    【讨论】:

    • 不明白为什么这是-1。我 +1 了
    • 谁有数学解决方案的有效链接?
    【解决方案2】:

    # 正如 beta 所说, # (sum(i))^2 - (sum(i^2)) 很容易计算:) # A = sum(i) = i*(i+1)/2 # B = sum(i^2) = i*(i+1)*(2*i + 1)/6 # A^2 - B = i(i+1)(3(i^2) - i - 2) / 12 # :) # 没有循环...只是一个公式!**

    【讨论】:

      【解决方案3】:

      在这种情况下,事先进行数学计算是值得的。您可以为平方和和和的平方推导出封闭形式的解。然后代码很简单(和 O(1))。

      在这两种解决方案方面需要帮助?

      【讨论】:

      • 现在我永远不会忘记在解决问题之前做一些数学运算。
      【解决方案4】:
      def sum_square_difference(n):
          r = range(1,n+1)
          sum_of_squares =  sum(map(lambda x: x*x, r))
          square_sum = sum(r)**2
          return sum_of_squares - square_sum
      

      【讨论】:

        【解决方案5】:

        在 Ruby 语言中,您可以通过这种方式实现此目的

        def diff_btw_sum_of_squars_and_squar_of_sum(from=1,to=100) # use default values from 1..100. 
        ((1..100).inject(:+)**2) -(1..100).map {|num| num ** 2}.inject(:+)
        end
        
        diff_btw_sum_of_squars_and_squar_of_sum #call for above method
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-04
          • 1970-01-01
          • 1970-01-01
          • 2023-03-26
          • 2016-05-24
          相关资源
          最近更新 更多