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

一般来说,表达式会在进行最终赋值之前从左到右进行评估。

但是,我不认为这是有效的语法——你有这段代码的源代码吗?

这个简单的代码失败了:

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

您可以尝试将此行分成两个单独的语句:

IE,

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

变成

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

cur += A[i+size]

假设你忠实地复制了代码,一些作者没有测试最终副本中包含的代码,所以我怀疑一个操作符被破坏的错误(特别是-=可能是其他一些操作符,例如,-

顺便说一句,我在这里(在页面底部)检查了这本书的勘误表。它没有列出此错误,您可以考虑将其提交给其他读者。

于 2012-05-14T11:26:39.293 回答
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设置为 的第一size项的总和A

在内部循环中,通过将切片右侧的值相加 ( A[i+size]) 并减去切片的第一个值( ),将切片“移动”到右侧A[i]

最后best设置为新计算的总和和迄今为止找到的最大值中的较大者。

最后,best包含最大的和。除非A包含负值,否则答案很简单:sum(A).

编辑:我刚刚注意到有一个错误:最左边的切片不计算在内,切片大小为 1 ( best = A[0]) 除外。因此,如果A = [4, 3, 2]它输出5而不是9. best = max(best, cur)通过在内部 for 循环上方添加一行来修复。

于 2012-05-14T11:44:06.173 回答