2012-05-14 51 views
1

我是個新手,Python和我碰到這個特殊的代碼片段來計算序列中的最大的切片來了,但我只是不能似乎明白下面的代碼這段語句在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) 

上的任何想法如何代碼的功能和特別是那條線會很有幫助!

+1

'... + = ... - = ...'作爲Python中的語法錯誤。 – eumiro

+0

@eumiro,糾正它! – KodeSeeker

+1

你有這個代碼的來源嗎? – Levon

回答

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循環外將產生較大的和較大的切片,從size設置爲1。然後cur被設定爲第一sizeA的總和。

在內部循環中,通過在切片右側添加值(A[i+size])並減去切片的第一個值(A[i]),將此切片「向右移動」。

最後best被設置爲新計算的總和和目前發現的最大值中的較大值。

最後,best包含最大的總和。除非A包含負值,否則答案是微不足道的:sum(A)

編輯:我剛剛注意到有一個錯誤:除了切片大小1(best = A[0]),最左邊的切片不計算在內。所以如果A = [4, 3, 2]它輸出5而不是9。通過在內部for循環上面添加best = max(best, cur)行來修復。

+0

謝謝隊友!來自另一種語言的Python看起來很奇怪!因此,懷疑! :) – KodeSeeker

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 

你可以嘗試打破這條線分爲兩個獨立的語句:

即,

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

成爲

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

cur += A[i+size] 

屁股uming你忠實地複製了代碼,一些作者不測試包含在最終副本的代碼,所以我懷疑,其中一個經營者錯位的錯誤(尤其-=可能是一些其他的操作,例如,-

由方式,我檢查了勘誤爲書here(在頁面的底部)。它沒有列出這個錯誤,你可以考慮把它提交給其他讀者。

+0

,會做,謝謝你看!:) – KodeSeeker