Algorithm 这个例程使用了多少堆栈空间?

Algorithm 这个例程使用了多少堆栈空间?,algorithm,Algorithm,假设树是平衡的,那么对于1000000个元素的树,例程将使用多少堆栈空间 void printTree(const Node *node) { char buffer[1000]; if(node) { printTree(node->left); getNodeAsString(node, buffer); puts(buffer); printTree(node->right); } } 这是《实用程序员》中的一个algo问题,答案是

假设树是平衡的,那么对于1000000个元素的树,例程将使用多少堆栈空间

void printTree(const Node *node) {
  char buffer[1000];
  if(node) {
    printTree(node->left);
    getNodeAsString(node, buffer);
    puts(buffer);
    printTree(node->right);
  }
}
这是《实用程序员》中的一个algo问题,答案是需要21个缓冲区(lg(1m)~=20,在最上面加1个)

但我认为它需要比顶层低1个以上的缓冲区,这是因为对左节点和右节点本身有2个调用。我错过了什么吗


*对不起,这真的不是家庭作业。在书店的勘误表上看不到这一点

首先进行左节点调用,然后该调用返回(因此其堆栈可供重用),然后进行一些工作,然后进行右节点调用

因此,下一级确实有两个缓冲区,但这两个缓冲区是连续需要的,而不是同时需要的。因此,您只需要在高水位线堆栈使用中计算一个缓冲区。重要的是函数递归的深度,而不是函数总共被调用了多少次


当然,假设代码是用类似于C的语言编写的,并且C实现使用一个自动变量堆栈(我还没有看到一个没有),诸如此类。

首先进行左节点调用,然后调用返回(因此其堆栈可供重用),然后还有一些工作要做,然后进行右节点调用

因此,下一级确实有两个缓冲区,但这两个缓冲区是连续需要的,而不是同时需要的。因此,您只需要在高水位线堆栈使用中计算一个缓冲区。重要的是函数递归的深度,而不是函数总共被调用了多少次


当然,假设代码是用类似于C的语言编写的,并且C实现使用了自动变量堆栈(我还没有看到没有),诸如此类。

第一个调用将递归到叶节点,然后返回。然后,第二个调用将启动——但在第二个调用发生时,第一个调用中的所有激活记录都将从堆栈中清除。照此,在任何给定的时间,堆栈上只有其中一个节点的数据。

第一个调用将一直递归到叶节点,然后返回。然后,第二个调用将启动——但在第二个调用发生时,第一个调用中的所有激活记录都将从堆栈中清除。在任何给定时间,堆栈上只有一个数据。

主要部分是
char buffer[1000]的堆栈大小在很大程度上取决于语言。主要部分是
字符缓冲区[1000]的堆栈大小在很大程度上取决于语言。