【问题标题】:Behaviour of static variables in recursion递归中静态变量的行为
【发布时间】:2014-09-08 14:20:24
【问题描述】:

我说的是 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 3 2 6 7 4 5。
  • k 是否为 const 在行为上没有区别。
  • @NeilKirk 我在代码中犯了一个错误……它不是 const 而是静态的……
  • @John 是的,你的输出是正确的,因为我用 const 代替了 static ....现在更正了..对不起

标签: c++ recursion data-structures stack


【解决方案1】:

我知道如果一个 int 在递归中被声明为 const,它的值不会在堆栈递归调用中重新初始化,而是使用当前值。

不,这是错误的。 const 与递归或重入无关。

但是如果堆栈变空(或递归计算完成)然后再次调用递归,它会使用与第一次堆栈调用中初始化的相同的 const 值吗??

const 是一个普通(尽管不可修改)变量:每当执行初始化语句时,即在 每个 函数调用时,它都会重新初始化。这对于 anystatic 变量是相同的。

static 局部变量表现出您所描述的行为:它们仅在第一次调用该函数时执行一次,而且重要的是,即使在调用堆栈完成后它们也不会重新初始化“清空”。函数是从外部重复调用还是递归调用都没有区别。

【讨论】:

  • 最后两行正是我要搜索的内容....现在我清楚了...谢谢..
【解决方案2】:

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

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

关于您的实施,您在先向左和先向右之间交替进行。 level 在要打印的行之前的行始终等于 1,因此您始终从右到左遍历打印行。当您拥有更深的树时,您会看到更大的节点洗牌。在纸上绘制一个示例树,并在您手动操作代码时在其上绘制导航。

【讨论】:

    猜你喜欢
    • 2018-01-08
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多