c++ - 静态变量在递归中的行为

标签 c++ recursion data-structures stack

我说的是 C++。 我知道如果在递归中将 int 声明为静态,则它的值不会在堆栈递归调用中重新初始化,而是使用当前值。

但是如果栈变空(或者递归计算完成)然后再次调用递归,它会使用与第一次栈调用时相同的静态值吗??

我会详细解释我的问题。

我正在尝试以螺旋形式编写层级遍历代码。

         1
       /   \
      2     3
     / \   / \
    7  6  5  4

螺旋形式的层序遍历将得到输出 1 2 3 4 5 6 7。

void LevelSpiral(node* root, int level)
{
    static int k = level%2;
    if(root==NULL)
        return;
    if(level==1)
    {
        printf("%d ",root->val);
    }
    else
    {
        if(k==0)
        {
            LevelSpiral(root->left,level-1);
            LevelSpiral(root->right,level-1);
        }
        else
        {
            LevelSpiral(root->right,level-1);
            LevelSpiral(root->left,level-1);
        }
    }
}

void LevelOrderSpiral(node* root)
{
    for(int i=1;i<=maxheight;i++)
        LevelSpiral(root,i);
}

LevelOrderSpiral 函数对每个 i 进行单独的 LevelSpiral 调用。但在整个代码中,它始终使用 k=1(在第一个 LevelSpiral 调用中使用 i=1 初始化)并将输出打印为 1 3 2 4 5 6 7。

它不应该打印 1 2 3 4 5 6 7 因为函数堆栈为每个 i 重新初始化吗?

最佳答案

您需要一个静态变量,因为它的值要在调用之间保留,或者从一个调用到下一个递归调用。

此外,递归并不是我用于广度优先遍历的第一个工具。我会使用节点(安全)指针队列(或引用包装器或其他)。将根节点放入队列中,然后循环直到队列为空,移除前面的元素并将其所有子节点入队,然后对最近移除的元素执行您想要的操作。

关于您的实现,您在先向左和先向右之间交替。在要打印的那一行之前,级别始终等于 1,因此您总是从右到左遍历打印行。当你有一个更深的树时,你会看到更大的节点改组。在纸上画一棵示例树,并在您手写代码时在上面画出导航。

关于c++ - 静态变量在递归中的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24808160/

相关文章:

python - 可以更有效地编写此递归吗?

c# - 并发子结构是否需要并发?

c++ - 我可以定义一个键是结构的映射吗?

c++ - 无法正确嵌套我的错误消息

c++ - 从 texture() 切换到 texelFetch()

c++ - 如何仅给定相应的 id 来确定 GL 帧缓冲区对象的宽度和高度

C++数组元素的构造顺序

c# - ReheapUp 和 ReheapDown 递归到迭代的转换 C#

java - 创建字符树

java - LinkedList - 试图理解实现