在递归期间难以保持变量的值

时间:2016-09-08 14:47:00

标签: python-3.x recursion divide-and-conquer

我试图使用分而治之的方法计算数组中的反转。但是,我无法保持反转的总数。程序完成后,它返回最后一步的反转次数而不是在它之前完成的所有倒置的总和。

def mergesort(A):
 if len(A) <2:
    return A
 mid = len(A)//2
 lefthalf = A[:mid]
 righthalf = A[mid:]
 mergesort(lefthalf)
 mergesort(righthalf)
 Total= merge(lefthalf,righthalf,A)
 return Total

def merge(left,right,A):
 Total = 0
 i,j,k = 0,0,0
 while i < len(left) and j < len(right):
     if left[i] <= right[j]:
         A[k] = left[i]
         i+=1
         k+=1
     else:
         A[k] = right[j]
         j+=1
         k+=1
         Total+= len(left[i:]) 
 while i < len(left):
      A[k] = left[i]
      i+=1
      k+=1
 while j < len(right):
      A[k] = right[j]
      j+=1
      k+=1  
 return Total     

print(mergesort([1,5,3,2,4]))

我怎样才能保持总计? 请通过解释建议对代码进行必要的更改。 感谢。

1 个答案:

答案 0 :(得分:0)

为了完整起见,这是一个答案,所以这个问题不会留在未答复的部分。

您需要始终跟踪当前堆栈帧中的反转次数,以及未来递归调用的堆栈帧。为此,您需要将递归调用的返回值添加到Total,或者将Total声明为将在每个递归调用之间共享的全局变量,而不是像现在一样保留局部变量。