2017-02-21 7 views
0

私は、Pythonで四角形の合計を取る方法が異なると考えています。ラムダ関数を使用している場合ラムダ関数を使った四角形の合計

def sum_of_squares(n): 
    return sum(x ** 2 for x in range(1, n)) 

しかし、次のように計算しない:なぜこれが

def sum_of_squares_lambda(n): 
    return reduce(lambda x, y: x**2 + y**2, range(1, n)) 

である私は、リストの内包表記を使用して、次の作品があることを発見しましたか?

+1

あなたは「計算しない」とはどういう意味ですか? – math2001

+2

平方和は 'ラムダx、y:x + y ** 2 'ではなく、'ラムダx、y:x ** 2 + y ** 2'に対応するためです。代わりに – hobbs

+1

x + y ** 2です。 xはラムダの現在の合計ですので、再度それを二乗しないでください。 –

答えて

1

あなたはそれぞれの連続した要素を四角形にすることになっています。 x**2 + y**2は、実行中の合計(x)と連続する各要素(y)を四角形にします。これをx + y**2に変更すると、正しい結果が得られます。コメントに記載されているように、適切な初期値も必要なので、オプションの第3引数として0を渡す必要があります。

>>> sum(x ** 2 for x in range(5,15)) 
985 
>>> reduce(lambda x, y: x + y**2, range(5,15)) 
965 
>>> reduce(lambda x, y: x + y**2, range(5,15), 0) 
985 
+1

'x + y ** 2 'を使うと、シーケンスが1から始まる限り動作しますが、任意のシーケンスに拡張しようとすると失敗します。 – BrenBarn

+0

@BrenBarn - 良い点;一定。 – TigerhawkT3

2

reduceについて考えてみましょう。 1つの呼び出しの出力を取り、同じ関数を再度呼び出すときに最初の引数として使用します。それでnが4であると想像してみてください。あなたのラムダをfと呼んだとします。次に、あなたはf(f(1, 2), 3)をやっています。あなたのラムダへの最初の引数が二乗されているので、正方形のあなたの最初の合計は次の呼び出しで再び乗され、その合計は、次の上に再び乗されます

(1**2 + 2**2)**2 + 3**2 

など:それは同等ですに。 (Python用3人のユーザ)

+0

ありがとう!それは多くの意味があります。つまり、iterableの次の2つの要素に対する再帰呼び出しのようなものです。 –

-2

from functools import reduce 

reduceを使用できるようにします。

第2に、sum_of_squares_lambdaは、最初と最後の引数を除くすべての引数を2回(1回ではなく)取るため、期待通りに機能しません。

+1

私は正しくインポートしていなかった場合、実行に時間がかかる代わりにエラーがスローされていました。 –

+1

'reduce'はPython 3の' functools'に移動しました。Python 2では組み込みです。 –

+0

あなたのコメントの前にこの回答を投稿しました... – math2001

0

はあなたが4プラグインとします

1^2 + 2^2 = 5 (you then take this result and put it back in the lambda) 
5^2 + 3^2 = 34 (for reference the correct answer is 14) 

それ正方形「前」の合計だけでなくlambdaインチ

(あなたはまた、1つの問題により、オフを持っている、それはあなたの範囲の呼び出しでn+1でなければなりません。)