如何在Python中的选择排序递归中返回交换数量的值

问题描述

代码

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,j + 1,swapNumber);
            
        
        else:
            selection(list,i + 1,i+2,1,swapNumber);
    return(swapNumber)       


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

因此,我试图返回swapNumber的值,但在打印时仅显示1。我试图将return(swapNumber)放在其他地方似乎没有帮助。 有人可以帮忙吗?

解决方法

传递给函数swapNumber的{​​{1}}是selection而非by value

一种可能的解决方案是将其声明为by reference

global
,

一种令人讨厌的方法是在函数内部定义一个函数并使用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_,j + 1,0)
            else:
                selection(list_,i + 1,i + 2,1)
        return swaps
    return selection(_list,1,1)

好处还在于,您无需将0,1作为初始参数,而只需将列表本身进行排序即可。