我是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)
关于代码如何运作以及特别是该行的任何想法都会有所帮助!
答案 0 :(得分: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]
假设您忠实地复制了代码,一些作者不会测试最终副本中包含的代码,因此我怀疑运算符被修复的错误(特别是-=
可能是其他运算符,例如{ {1}})
顺便说一下,我查看了书籍here的勘误表(位于页面底部)。它没有列出此错误,您可以考虑将其提交给其他读者。
答案 1 :(得分: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
的{{1}}项的总和
在内部循环中,通过将值添加到切片右侧(A
)并减去切片的第一个值(A[i+size]
),将此切片“移动”到右侧。
最后A[i]
设置为新计算的总和中的较大值,以及迄今为止找到的最大值。
最后,best
包含最大的总和。除非best
包含负值,否则答案很简单:A
。
编辑:我刚注意到有一个错误:除了切片大小为1(sum(A)
)之外,最左边的切片不计算在内。因此,如果best = A[0]
输出A = [4, 3, 2]
而不是5
。通过在内部for循环上方添加9
行来修复。