5

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を使用しています

ありがとうございました。

4

5 に答える 5

11

この関数は、次のような純粋数学で記述できます。

式

Pythonに翻訳:

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

この式は、他の2つの式を簡略化したものです。

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)/6ここで説明する式は、最初のn自然数の2乗の合計を返します。

(n*(n+1)/2))**2n最初の自然数の合計であり、次に二乗される三角数の式を使用します。


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の数値の2乗の合計をsum(r)**2返し、rの数値の合計の2乗を返します。

于 2013-03-23T23:59:10.563 に答える
5

#ベータが言うように、 #(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 #: )#ループなし...ただの数式!**

于 2013-03-24T00:17:21.557 に答える
3

これは、事前に計算を行うことで費用が発生する場合です。2 乗和と 2 乗和の両方について閉形式の解を導き出すことができます。その場合、コードは簡単です (そして O(1))。

2 つのソリューションについてサポートが必要ですか?

于 2013-03-24T00:04:16.137 に答える
2
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
于 2013-03-23T23:57:26.787 に答える