Python 合并排序递归中的未绑定本地错误
读过之后,我从内存中为Python 合并排序递归中的未绑定本地错误,python,python-3.x,recursion,Python,Python 3.x,Recursion,读过之后,我从内存中为mergeSort编写了代码。我犯了一个错误,没有在if语句后缩进,没有包括mergeSort的递归调用。我得到了相同的未排序数组[54、26、77、31、44、55、20、93、17],解释器没有错误 我回顾了引用,然后意识到我没有进行递归调用(在下面的代码中注释掉)。我将它们包括在内,并得到以下错误: UnboundLocalError: local variable 'leftHalf' referenced before assignment 在递归调用merge
mergeSort
编写了代码。我犯了一个错误,没有在if
语句后缩进,没有包括mergeSort
的递归调用。我得到了相同的未排序数组[54、26、77、31、44、55、20、93、17]
,解释器没有错误
我回顾了引用,然后意识到我没有进行递归调用(在下面的代码中注释掉)。我将它们包括在内,并得到以下错误:
UnboundLocalError: local variable 'leftHalf' referenced before assignment
在递归调用mergeSort
之前,我不明白为什么这不是一个问题。我还认为Python不象C++那样,在代码>变量> > />代码>语句中,可以引用外部语句。
我知道,if
语句之后的所有内容都应该缩进,这样才能正确执行,但在遇到这个问题后,我想理解Python
def合并排序(列表):
如果len(alist)>1:
mid=len(alist)//2#选择较短的一端作为左侧
leftHalf=alist[:mid]
rightHalf=alist[中间:]
#合并排序(左半部分)
#合并排序(右半部分)
i=0
j=0
k=0
而i
我查看了,但无法找出我的情况与问题中的情况有多相似,因为我没有定义新函数。代码中的问题是
len(alist)
不大于1。在这种情况下,没有定义mid、leftHalf或righhalf变量。if
语句中的变量可以在Python语句之外引用,但这里的问题是,如果条件的计算结果为False
,则不会定义这三个变量
在
if
语句之后添加else
语句和给变量赋值(mid
,leftHalf
,righhalf
)可以解决这个问题(只添加一个else
而不添加变量不能解决问题)。否则,您可以使用一些默认值在if
语句之前定义三个变量。问题在于您错误地复制了函数。从i=j=k=0开始,它们都应包含在if函数中。压痕是错误的
def mergeSort(alist):
if len(alist) > 1:
mid = len(alist) // 2 # pick shorter end as left
leftHalf = alist[:mid]
rightHalf = alist[mid:]
# mergeSort(leftHalf)
# mergeSort(rightHalf)
i = 0
j = 0
k = 0
while i < len(leftHalf) and j < len(rightHalf):
if leftHalf[i] < rightHalf[j]:
alist[k] = leftHalf[i]
i += 1
else:
alist[k] = rightHalf[j]
j += 1
k += 1
# right side was all smaller and is done. Fill all left
while i < len(leftHalf):
alist[k] = leftHalf[i]
i += 1
k += 1
# left side was all smaller and is done. Fill all right
while j < len(rightHalf):
alist[k] = rightHalf[j]
i += 1
k += 1
alist = [54,26,93,17,77,31,44,55,20]
mergeSort(alist)
print(alist)
def合并排序(列表):
如果len(alist)>1:
mid=len(alist)//2#选择较短的一端作为左侧
leftHalf=alist[:mid]
rightHalf=alist[中间:]
#合并排序(左半部分)
#合并排序(右半部分)
i=0
j=0
k=0
而i
请阅读有关的信息。您还可以使用它来帮助逐步可视化代码的执行。想一想,当函数只使用一个项调用时会发生什么……这是一种教递归的糟糕方法。从上周开始,我演示了如何使用带有函数风格的递归编写mergesort
。如果您有后续问题,请告诉我^^^ Tomerikoo-谢谢我不知道Python-tutor。谢谢-我问了一个后续问题您的链接问题。主要询问功能性遗产的含义以及您希望人们避免的问题。