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

Posted

技术标签:

【中文标题】在递归期间难以保持变量的值【英文标题】:Difficulty mantaining value of a variable during Recursion 【发布时间】:2017-01-16 13:35:47 【问题描述】:

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

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     

打印(合并排序([1,5,3,2,4]))

如何维护 Total ? 请建议对代码进行必要的更改并附上解释。 谢谢。

【问题讨论】:

你不应该做Total += mergesort(left half)Total += mergesort(righthalf)吗?当前未使用这些递归调用的返回值。 你的例程中有`return Total return A`。是哪一个? @Jean-François Fabre 返回总计 @TabishBashir 然后您需要在基本情况下返回 0 if len(A)&lt;2... @gowrath Don,由于排序发生在合并步骤中,所有反转都被计算在内吗? 【参考方案1】:

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

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

【讨论】:

以上是关于在递归期间难以保持变量的值的主要内容,如果未能解决你的问题,请参考以下文章

如何使MySQL前后端连接SESSION变量保持一致

Python基础之函数,递归。

有没有办法在不同的类中设置一个等于变量的值,并让它保持第一次运行的值而不必每次都运行?

如何做到赋值另一个变量,其值改变,原来的值保持不变

如何在调整大小期间保持相同的场景部分?

代码将不同的变量保持在同一个名称下,而不是覆盖