Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何处理递归python排序函数中的作用域_Python_Sorting_Scope - Fatal编程技术网

如何处理递归python排序函数中的作用域

如何处理递归python排序函数中的作用域,python,sorting,scope,Python,Sorting,Scope,我正在用Python实现Stooge排序,我不明白为什么我对数组顺序的更改没有坚持下去。换言之,当我递归地向下钻取时,单元似乎正在被交换,但在函数返回后,数组的顺序保持不变。这是一个范围问题,还是其他我还不明白的pythonism?还是我的算法不正确 import math def StoogeSort(A): n = len(A) if (n == 2 and A[0] > A[1]): tmp = A[0] A[0] = A[1]

我正在用Python实现Stooge排序,我不明白为什么我对数组顺序的更改没有坚持下去。换言之,当我递归地向下钻取时,单元似乎正在被交换,但在函数返回后,数组的顺序保持不变。这是一个范围问题,还是其他我还不明白的pythonism?还是我的算法不正确

import math

def StoogeSort(A):

    n = len(A)

    if (n == 2 and A[0] > A[1]):

        tmp = A[0]
        A[0] = A[1]
        A[1] = tmp 

    elif n > 2:

        m = int(math.ceil((2 * n) / 3)) 
        StoogeSort(A[0:m]) 
        StoogeSort(A[m-n:n]) 
        StoogeSort(A[0:m]) 

    return A


A = [4,2,1]
StoogeSort(A)
print "End:",A
A = [44,12,8,33,100]
StoogeSort(A)
print "End:",A


问题在于您的切片-
A[0:m]
,等等。这些切片不会在原始列表中创建视图,而是创建新列表


您可以使用如上所述的numpy数组,或者使用递归调用的返回值来构造要返回的新列表。

1。-您正在向递归发送原始数组的副本,而不仅仅是原始数组的一部分。 2.-虽然您将发送原始数组的一部分,但不处理数组的一部分,只发送索引

def StoogeSort(L, i, j):
    if L[i] > L[j]: #<-- always switching elements (not just for n=2)
        L[j],L[i]=L[i],L[j]  
    if (j - i + 1) > 2:
        t = int((j - i + 1) / 3)
        StoogeSort(L, i, j-t)  #<-- here, sending indexes.
        StoogeSort(L, i+t,j)
        StoogeSort(L, i, j-t)
    return L

>>> L = [7,8,9,5,6,4,2,1]
>>> StoogeSort(L, 0, len(L)-1)
[1, 2, 4, 5, 6, 7, 8, 9]
def StoogeSort(L,i,j):
如果L[i]>L[j]:#2:
t=int((j-i+1)/3)
StoogeSort(L,i,j-t)#>>L=[7,8,9,5,6,4,2,1]
>>>斯托格斯波特(L,0,len(L)-1)
[1, 2, 4, 5, 6, 7, 8, 9]

列表切片是列表本身的副本。身份证(A)!=id(A[0:m])