如何在python中递归返回Selection-Sort中交换次数的值



代码:

def selection(list, i, j, flag, swapNumber):

size = len(list)
if (i < size - 1):
if (flag):
j = i + 1;
print(list)

if (j < size):
if (list[i] > list[j]):
swapNumber +=1
print(swapNumber)
list[i],list[j]=list[j],list[i]

print(list)
selection(list, i, j + 1, 0, swapNumber);


else:
selection(list, i + 1, i+2, 1, swapNumber);
return(swapNumber)       


swapNumber = 0
list = [6, 2, 3, 7, 1]
numSwap = selection(list, 0, 1, 1, swapNumber)
print(list)
print(numSwap)

所以我试图返回swapNumber的值,但当它打印时,它只显示1。我试着把退货(swapNumber(放在其他地方似乎没有帮助。有人能帮忙吗?

传递给函数selectionswapNumber是除by reference之外的by value

一种可能的解决方案是将其声明为global:

def selection(list, i, j, flag):
global swapNumber
size = len(list)
if (i < size - 1):
if (flag):
j = i + 1;
print(list)

if (j < size):
if (list[i] > list[j]):
swapNumber +=1
print(swapNumber)
list[i],list[j]=list[j],list[i]

print(list)
swapNumber = selection(list, i, j + 1, 0);


else:
swapNumber = selection(list, i + 1, i+2, 1);
return(swapNumber)       


swapNumber = 0
list = [6, 2, 3, 7, 1]
numSwap = selection(list, 0, 1, 1)
print(list)
print(numSwap)

一种奇特的方法是在函数内部定义函数并使用nonlocal。看起来像这样:

def selection_sort(list_):
swaps = 0
def selection(list_, i, j, flag):
nonlocal swaps
size = len(list_)
if i < size - 1:
if flag:
j = i + 1
if j < size:
if list_[i] > list_[j]:
swaps += 1
list_[i], list_[j] = list_[j], list_[i]
selection(list_, i, j + 1, 0)
else:
selection(list_, i + 1, i + 2, 1)
return swaps
return selection(_list, 0, 1, 1)

好处还在于,您不需要将0, 1, 1作为初始参数传递,只需要将列表本身排序即可。

最新更新