如何 return python 中选择排序递归交换次数的值

How to return value of number of swaps in Selection Sort recursive in 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, 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)

所以我正在尝试 return swapNumber 的值,但是当它打印时它只显示 1。我尝试将 return(swapNumber) 放在其他地方似乎没有帮助. 有人可以帮忙吗?

传递给函数 selectionswapNumberby value 而不是 by reference

一种可能的解决方案是将其声明为 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 作为初始参数,只需传递要排序的列表本身。