Recursion 从递归堆栈执行调用的过程,调用是如何处理的,它们返回什么,这有什么关系?

Recursion 从递归堆栈执行调用的过程,调用是如何处理的,它们返回什么,这有什么关系?,recursion,stack,binary-search-tree,sortedlist,Recursion,Stack,Binary Search Tree,Sortedlist,我听说递归调用是从堆栈中进行的。但我发现最困难的事情是如何从递归堆栈处理它们?我听说调用顺序存储在堆栈中,最后一个调用返回到堆栈中的前一个调用,并且过程继续。在计算一个数的阶乘时,我能理解这一点。但是,下面的代码将排序数组转换为二进制搜索树,这让我很为难 代码如下: class Node: def __init__(self, d): self.data = d self.left = None self.right = None #

我听说递归调用是从堆栈中进行的。但我发现最困难的事情是如何从递归堆栈处理它们?我听说调用顺序存储在堆栈中,最后一个调用返回到堆栈中的前一个调用,并且过程继续。在计算一个数的阶乘时,我能理解这一点。但是,下面的代码将排序数组转换为二进制搜索树,这让我很为难

代码如下:

class Node:
    def __init__(self, d):
        self.data = d
        self.left = None
        self.right = None
  
# function to convert sorted array to a
# balanced BST
# input : sorted array of integers
# output: root node of balanced BST
def sortedArrayToBST(arr):
      
    if not arr:
        return None
  
    # find middle
    mid = (len(arr)) / 2
      
    # make the middle element the root
    root = Node(arr[mid])
      
    # left subtree of root has all
    # values <arr[mid]
    root.left = sortedArrayToBST(arr[:mid])
      
    # right subtree of root has all 
    # values >arr[mid]
    root.right = sortedArrayToBST(arr[mid+1:])
    return root

类节点:
定义初始化(self,d):
self.data=d
self.left=无
self.right=无
#函数将排序数组转换为
#平衡BST
#输入:整数的排序数组
#输出:平衡BST的根节点
def分拣机Darraytobst(arr):
如果没有arr:
一无所获
#居中
mid=(len(arr))/2
#使中间元素成为根元素
根=节点(arr[mid])
#根的左子树具有全部
#值arr[mid]
root.right=sortedArrayToBST(arr[mid+1:]
返回根
现在我的示例集是:[-10,-3,0,5,9]

我知道这必须是递归的,因为同一个过程会发生多次。但让我困惑的是堆栈内部发生了什么?当控件遇到叶节点并将其添加为左子节点(
root.left=sortedarraytost(arr[:mid])
)时,调用如何从堆栈中弹出,或者甚至如何将某个内容返回到它的下一个直接子节点,以使该过程平稳地继续


有谁能举例说明使用堆栈并显示每次调用时发生的推送和弹出任务吗?提前感谢。

可能需要注意的是,这并不是实现该功能的最有效方法,因为在执行切片时,您正在复制列表的一部分。最佳方法包括通过将索引作为参数传递来避免复制列表的任何部分(即
sortedArrayTobstines(arr,start,end)
应等同于
sortedArrayToBST(arr[start:end])
。尝试使用CodeSkulptor Viz模式,该模式一步一步地遍历Python 2代码的执行。感谢@Mark Save提供的信息。但是,如何使用CodeSkulptor运行代码并指出其中的差异?我将代码粘贴在那里,但一旦运行,就找不到断点,甚至找不到逐行执行pro塞斯,请帮忙。