これは私のコードです:
def sum_even(a, b):
count = 0
for i in range(a, b, 1):
if(i % 2 == 0):
count += [i]
return count
私が入れた例は print(sum_even(3,7)) で、出力は0です。何が悪いのかわかりません。
これは私のコードです:
def sum_even(a, b):
count = 0
for i in range(a, b, 1):
if(i % 2 == 0):
count += [i]
return count
私が入れた例は print(sum_even(3,7)) で、出力は0です。何が悪いのかわかりません。
インデントがオフになっています。次のようにする必要があります。
def sum_even(a, b):
count = 0
for i in range(a, b, 1):
if(i % 2 == 0):
count += i
return count
そのためreturn count
、 for ループにスコープされません (その場合、最初の反復で返され、0 が返されます)
(そして[i]
に変更i
)
注:別の問題 - の使用には注意が必要ですrange
:
>>> range(3,7)
[3, 4, 5, 6]
したがって、次の呼び出しを行う場合:
sum_even(3,7)
sum_even(3,8)
現時点では、どちらも を出力します10
が、これは 3 から 8 までの偶数の整数の合計には正しくありません。
あなたが本当に欲しいのはおそらくこれです:
def sum_even(a, b):
return sum(i for i in range(a, b + 1) if i % 2 == 0)
return
ステートメントをループの範囲外に移動しfor
ます (そうしないと、最初のループ反復で戻ります)。
に変更count += [i]
しcount += i
ます。
また、(これを知っているかどうかはわかりませんが) からまでrange(a, b, 1)
のすべての数字が含まれます( ではない)。さらに、引数は必要ありません。同じ効果があります。したがって、 から までのすべての数字を含めるには、を使用する必要があります。a
b - 1
b
1
range(a,b)
a
b
range(a, b+1)
a
からまでのすべての偶数を加算するおそらく最も速い方法b
は、
sum(i for i in xrange(a, b + 1) if not i % 2)
範囲関数にステップ引数を適切に使用することで、それよりもはるかに簡単にすることができます。
def sum_even(a, b):
return sum(range(a + a%2, b + 1, 2))
ループは必要ありません。簡単な代数を使用できます:
def sum_even(a, b):
if (a % 2 == 1):
a += 1
if (b % 2 == 1):
b -= 1
return a * (0.5 - 0.25 * a) + b * (0.25 * b + 0.5)
編集:
NPE が指摘したように、上記の私の元のソリューションは浮動小数点演算を使用しています。浮動小数点演算のオーバーヘッドは、ループの削除に比べて無視できるほど小さいため (たとえば、 を呼び出した場合)、私はあまり気にしませんでしたsum_even(10, 10000)
。さらに、計算では 2 の (負の) べき乗が使用されるため、丸め誤差の影響を受けません。
いずれにせよ、すべてを 4 で乗算し、最後にもう一度割るという単純なトリックを使用すると、全体で整数を使用できます。これは望ましいことです。
def sum_even(a, b):
if (a % 2 == 1):
a += 1
if (b % 2 == 1):
b -= 1
return (a * (2 - a) + b * (2 + b)) // 4
b が 2^32 に近い場合にループがどのように機能するかを確認してください ;-) Matthew が言ったように、必要なループはありませんが、彼はその理由を説明していません。
問題は単純な算術シーケンスwikiです。このような順序のすべての項目の合計は次のとおりです。
(a+b)
Sn = ------- * n
2
ここで、「a」は最初の項目、「b」は最後、「n」は項目の番号です。「a」と「b」を偶数にすれば、与えられた問題を簡単に解くことができます。したがって、「a」と「b」を均等にするのは次のとおりです。
if ((a & 1)==1):
a = a + 1
if ((b & 1)==1):
b = b - 1
ここで、2 つの偶数の間にいくつの項目があるか考えてみてください - それは次のとおりです。
b-a
n = --- + 1
2
それを方程式に入れると、次のようになります。
a+b b-a
Sn = ----- * ( ------ + 1)
2 2
コードは次のようになります。
def sum_even(a,b):
if ((a & 1)==1):
a = a + 1
if ((b & 1)==1):
b = b - 1
return ((a+b)/2) * (1+((b-a)/2))
もちろん、a が b と等しいか、b より大きくならないようにコードを追加することもできます。
Python ではインデントが重要です。記述したコードは、最初のアイテムが処理された後に返されます。
これは、range 関数を使用して行う簡単な方法かもしれません。範囲の 3 番目の数値はステップ番号、つまり 0、2、4、6...100 です。
sum = 0
for even_number in range(0,102,2):
sum += even_number
print (sum)
高度な python 機能を使用すると、もう少し派手になります。
def sum(a,b):
return a + b
def evensum(a,b):
a = reduce(sum,[x for x in range(a,b) if x %2 ==0])
return a
def sum_even(a,b):
count = 0
for i in range(a, b):
if(i % 2 == 0):
count += i
return count
ここで2つの間違い:
開始番号と終了番号の間のすべての偶数の合計(両端を含む)。
def addEvenNumbers(start,end):
total = 0
if end%2==0:
for x in range(start,end):
if x%2==0:
total+=x
return total+end
else:
for x in range(start,end):
if x%2==0:
total+=x
return total
print addEvenNumbers(4,12)