たとえば、x ^ 2がnより大きくなるまで、x=1以降のすべてのx^2(またはその他の任意の関数)を合計したいとします。これは、一連のwhileループとif-checkを使用せずに実行できますか?
質問する
244 次
5 に答える
6
itertoolsモジュールには、拡張可能なソリューションのためのいくつかの優れた機能があります。
from itertools import takewhile, count
def sum_func(func, n):
return sum(takewhile(lambda x: x < n, (func(i) for i in count(1))))
例えば:
>>> sum_func(lambda x: x**2, 20) # 1^2 + 2^2 + 3^2 + 4^2
30
これを減少関数でも機能させたい場合は、テスト関数を渡すこともできます。
def sum_func(func, pred):
return sum(takewhile(pred, (func(i) for i in count(1))))
例:
>>> sum_func(lambda x: -x*2, lambda x: x > -10) # -1*2 + -2*2 + -3*2 + -4*2
-20
于 2012-12-12T17:41:23.317 に答える
3
絶対。
>>> sum(x ** 2 for x in itertools.takewhile(lambda x: x ** 2 <= 100, itertools.count(1)))
385
于 2012-12-12T17:41:23.587 に答える
1
あなたはただする必要がありません...
max_val = 144
sum(x**2 for x in range(sqrt(max_val)))
于 2012-12-12T17:40:19.580 に答える
0
x
毎回1ずつ増えますか?
もしそうなら、これは次の式になります:x(x+1)(2x+1)/6
、それは整数の二乗の合計だからです。
だからあなたは本当にループを避けたいので、あなたはx(x+1)(2x+1)/6 < n
直接解決することができます
于 2012-12-12T17:41:13.483 に答える
0
x ^ 2がnより大きくなるまで、すべてのx^2を合計します
sum = 0
x = 1
while x**2 <= n:
sum += x**2
x += 1
1つのwhile
ループ、if
sなし。
for
ループを使用したい場合:
import itertools
sum = 0
for x in itertools.count(1): # Generates an infinite series: 1, 2, 3, ...
square = x**2
if square > n:
break
sum += square
1つのfor
ループ、1つのif
。ほとんど「束」。
于 2012-12-12T17:43:06.703 に答える