2

たとえば、x ^ 2がnより大きくなるまで、x=1以降のすべてのx^2(またはその他の任意の関数)を合計したいとします。これは、一連のwhileループとif-checkを使用せずに実行できますか?

4

5 に答える 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ループ、ifsなし。

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 に答える