1

私は python の初心者で、シーケンス内の最大のスライスを計算するためにこの特定のコード スニペットに出くわしましたが、次のコードを理解できないようです

best = A[0] 
for size in range(1,n+1): 
   cur = sum(A[:size]) 
   for i in range(n-size): 
      cur += A[i+size] -= A[i] # <- what happens here?
      best = max(best, cur) 

コードがどのように機能するか、特にその行についてのアイデアは役に立ちます!

4

2 に答える 2

2

まず、コードのエラーは余分なもの=です。作業コード:

n = len(A)
best = A[0] 
for size in range(1,n+1): 
   cur = sum(A[:size]) 
   for i in range(n-size): 
      cur += A[i+size] - A[i] # <- what happens here?
      best = max(best, cur)

外側のforループは、set 1から始めて、ますます大きなスライスを作成sizeします。次に、の最初の項目のcur合計に設定されます。sizeA

内側のループでは、スライスのすぐ右側に値を加算し(A[i+size])、スライスの最初の値を減算することにより、このスライスを右に「移動」します(A[i])。

最後bestに、新しく計算された合計とこれまでに見つかった最大値のいずれか大きい方に設定されます。

最後にbest、最大の合計が含まれています。負の値が含まれていない限りA、答えは簡単ですsum(A)

編集:バグがあることに気づきました:スライスサイズ1()を除いて、左端のスライスはカウントされませんbest = A[0]。したがって、の代わりにA = [4, 3, 2]出力する場合。内側のforループの上に行を追加して修正します。59best = max(best, cur)

于 2012-05-14T11:44:06.173 に答える
2

一般に、式は最終的な代入を行う前に左から右に評価されます。

ただし、これが有効な構文だとは思いません。このコードのソースはありますか?

この単純なコードは失敗します:

In [246]: a = 5
In [247]: b = 10
In [248]: c = 0

In [249]: c += a -= b
  File "<ipython-input-249-67e83b5a3545>", line 1
    c += a -= b
            ^
SyntaxError: invalid syntax

この行を 2 つの別個のステートメントに分割してみてください。

すなわち、

cur += A[i+size] -= A[i]

になる

A[i+size] -= A[i]

cur += A[i+size]

コードを忠実にコピーしたと仮定すると、一部の作成者は最終コピーに含まれるコードをテストしないため、演算子が破損したエラーが疑われます (特に-=、他の演算子、たとえば-)

ちなみに、本書の正誤表はこちら(ページ下部)で確認しました。このエラーはリストされていません。仲間の読者に送信することを検討してください。

于 2012-05-14T11:26:39.293 に答える