@EliSadoffコメントで述べたように、あなたはあなたの関数でresult
の初期値を必要としています。ただdef
行の後の行
result = 1
を挿入します。その後、コードは動作し、これは暗黙的にb
というバイナリ表現を使用して累乗を素早く取得するための標準的な方法です。 (ループ不変はresult * a ** b
の値は、このアルゴリズムの有効性を示しており、一定のままであることである。)
あなたif b % 2
ラインがwhile
ループを通るたびに実行された場合、最悪のケースです。これは、b
が2の累乗よりも1少ない場合に発生します。したがって、b
の各桁はバイナリ表現が1です。 while
ループ条件while b>0
はまだチェックされているに過ぎません。m+1
回ですが、各ループにもう少し処理が必要です。
コードをスピードアップする方法はいくつかあります。 if b % 2 = 1
ではなくwhile b>0
およびif b & 1
ではなく、while b
を使用してください。 b = b // 2
ではなくa = a*a
およびb >>= 1
ではなく、result = result*a
およびa *= a
ではなく、result *= a
を使用してください。これらはもちろん、ほんのわずかな改善です。ループをさらに高速化する唯一の方法は、構造化されていないコードを使用することです。これはPythonでは不可能と思います。 (a
には1つ以上の修正が必要ですが、ループにジャンプすることなくそのようなことを防ぐ良い方法はありません)。a
とb
を変更しないようにする内部ループなど、このコードにはいくつかのバリエーションがあります。 b
は偶数ですが、必ずしも高速であるとは限りません。
最終的なコードは、私は少し良くフィットPEP8(Pythonのスタイルの基準)にあなたのコードをクリーンアップし、その後
def power(a, b):
"""Return a ** b, assuming b is a nonnegative integer"""
result = 1
while b:
if b & 1:
result *= a
a *= a
b >>= 1
return result
です。特にb
が非負整数であることを確認するために、コードのエラーチェックはありません。 b
が負の整数である場合にコードが無限ループになると信じていますが、結果は偽の結果を返します。だから、エラーチェックをしてください!また、あなたのコードには、このような関数のためのかなり標準的なpower(0, 0) == 1
が記載されていますが、まだ驚いていくつかの人々がかかることに注意してください。
これは機能しません。 'result'は宣言されておらず、私はあなたが力を計算するために使っているロジックを理解していません。 –
それを試してください、それは働く必要があります。私はコードに解釈する数学的な原則を使用します。 – Yasmin12
私はこれを試してみると、 'UnboundLocalError:ローカル変数 'result'が代入の前に参照されています。 –