【发布时间】: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