Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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 解释此合并排序代码中L和R的范围? def合并排序(arr): 如果len(arr)>1: mid=len(arr)//2#查找数组的mid L=arr[:mid]#分割数组元素 R=arr[mid:][分成两半 合并排序(L)#对上半部分进行排序 合并排序(R)#对后半部分进行排序 i=j=k=0 #将数据复制到临时数组L[]和R[] 而i_Python_Recursion - Fatal编程技术网

Python 解释此合并排序代码中L和R的范围? def合并排序(arr): 如果len(arr)>1: mid=len(arr)//2#查找数组的mid L=arr[:mid]#分割数组元素 R=arr[mid:][分成两半 合并排序(L)#对上半部分进行排序 合并排序(R)#对后半部分进行排序 i=j=k=0 #将数据复制到临时数组L[]和R[] 而i

Python 解释此合并排序代码中L和R的范围? def合并排序(arr): 如果len(arr)>1: mid=len(arr)//2#查找数组的mid L=arr[:mid]#分割数组元素 R=arr[mid:][分成两半 合并排序(L)#对上半部分进行排序 合并排序(R)#对后半部分进行排序 i=j=k=0 #将数据复制到临时数组L[]和R[] 而i,python,recursion,Python,Recursion,尽管L和R是自变量,但它们的值如何随递归函数中L和R值的变化而变化?有人能详细解释一下吗?在python中,列表是一个可变对象,因此这里L和R是通过引用传递的,末尾的“返回arr”甚至是不必要的。这意味着即使通过递归函数调用也会修改列表。 使用调试器,研究合并排序算法拆分每个项目并开始排序的关键时刻,您将更好地了解它的工作原理 但是代码的缩进有问题。您需要在函数声明下缩进所有代码,除了返回行。L和R始终是局部变量,但是mergesort会改变您传入的列表,例如arr[k]=L[i]。请注意,您正

尽管L和R是自变量,但它们的值如何随递归函数中L和R值的变化而变化?有人能详细解释一下吗?

在python中,列表是一个可变对象,因此这里L和R是通过引用传递的,末尾的“
返回arr
”甚至是不必要的。这意味着即使通过递归函数调用也会修改列表。 使用调试器,研究合并排序算法拆分每个项目并开始排序的关键时刻,您将更好地了解它的工作原理


但是代码的缩进有问题。您需要在函数声明下缩进所有代码,除了
返回
行。

L
R
始终是局部变量,但是
mergesort
会改变您传入的列表,例如
arr[k]=L[i]
。请注意,您正在复制每个子列表。比较这三个函数:
def(L):L.append(3)
def g(L):L=L+[4]
def h(L):L[0]=5
。试试看:
L=[1,2];印刷品(L);f(L);印刷品(L);L=[1,2];印刷品(L);g(L);印刷品(L);L=[1,2];印刷品(L);h(L);印刷品(L)
您的评论
#将数据复制到临时数组L[]和R[]
有误导性。这个注释后面的while循环不是从L和R复制数据,而是从L和R复制数据。我确信从
开始的所有行如果len(arr)>1:
都需要一个缩进级别,而不仅仅是前6个缩进级别。你是对的,否则在算法的其余部分中L和R将不被知道。返回行是正确的。谢谢Stef,我编辑了我的答案。
def mergeSort(arr): 
if len(arr) >1: 
    mid = len(arr)//2 # Finding the mid of the array 
    L = arr[:mid] # Dividing the array elements  
    R = arr[mid:] # into 2 halves 

    
    mergeSort(L) # Sorting the first half 
    mergeSort(R) # Sorting the second half 

    i = j = k = 0
      
    # Copy data to temp arrays L[] and R[] 
    while i < len(L) and j < len(R): 
        if L[i] < R[j]: 
            arr[k] = L[i] 
            i+= 1
        else: 
            arr[k] = R[j] 
            j+= 1
        k+= 1
      
    # Checking if any element was left 
    while i < len(L): 
        arr[k] = L[i] 
        i+= 1
        k+= 1
      
    while j < len(R): 
        arr[k] = R[j] 
        j+= 1
        k+= 1
    return arr