C++ 使用全局变量与通过函数传递变量的不同输出
C++ different output using global variables vs passing variable thorugh function
我正在解决 this 个问题。
当 min
和 max
变量被设置为全局变量时,我得到了正确的输出,但是当我在函数中传递它们时它弄乱了输出。
我想不通原因。 谁能告诉我,这两个代码片段有何不同。
global:
int min = 1,max = 0;
//dfs in which left subtree is travelled before right
void travLeft(Node * root, int i,vector<int> &left)
{
if(root==NULL) return;
if(i<min)
{
min = i;
left.push_back(root->data);
}
travLeft(root->left,i-1,left);
travLeft(root->right,i+1,left);
}
void travRight(Node * root, int i,vector<int> &right)
{
if(root==NULL) return;
if(i>max)
{
max = i;
right.push_back(root->data);
}
travRight(root->right,i+1,right);
travRight(root->left,i-1,right);
}
void topView(Node * root) {
vector<int> left,right;
travLeft(root,0,left);
travRight(root,0,right);
for(int i=left.size()-1;i>=0;i--)
{
cout<<left[i]<<" ";
}
for(int i=0;i<right.size();i++)
{
cout<<right[i]<<" ";
}
}
passing in the function :
//dfs in which left subtree is travelled before right
void travLeft(Node * root,int min, int i,vector<int> &left)
{
if(root==NULL) return;
if(i<min)
{
min = i;
left.push_back(root->data);
}
travLeft(root->left,min,i-1,left);
travLeft(root->right,min,i+1,left);
}
void travRight(Node * root,int max, int i,vector<int> &right)
{
if(root==NULL) return;
if(i>max)
{
max = i;
right.push_back(root->data);
}
travRight(root->right,max,i+1,right);
travRight(root->left,max,i-1,right);
}
void topView(Node * root) {
vector<int> left,right;
travLeft(root,INT_MAX,0,left);
travRight(root,0,0,right);
for(int i=left.size()-1;i>=0;i--)
{
cout<<left[i]<<" ";
}
for(int i=0;i<right.size();i++)
{
cout<<right[i]<<" ";
}
}
全局变量是全局的。对值的更改将在 travLeft
和 travRight
.
的所有调用中保留
另一方面,参数是函数的局部参数。 min
和max
的新值被传递到下一级递归,但是min
的更新在第一个递归
travLeft(root->left,min,i-1,left);
不会传递给第二次递归
travLeft(root->right,min,i+1,left);
因为min
相同的值,在这一层被更新(或者不更新,来自上一层),被传递给两次调用。
max
和 travRight
.
也会发生同样的事情
这就是区别。
当用作全局变量时,更改将在所有层中发生(并保留更改)。但是,如果将它们传递给函数,对于每个递归阶段(层),变量将具有特定值,该值对于该特定层将保持不变。
@MikeCat 和@SoumitraChatterjee 已经说明了你的版本传入变量失败的原因
要使其工作,您可以选择将参数设置为将 min
和 max
作为参考,这样更改将反映为原始值:
void travLeft(Node* root, int& min, int i, vector<int> &left) { //... }
^^^^
请注意,为参数 max
和 min
设置默认值可能很诱人,例如:
// this doesn't work
// ↓ ↓ ↓ ↓ ↓ ↓
// void travLeft(Node* root, int i, vector<int> &left, int& min = 0)
但是,这将不起作用,因为您试图将 min
设置为临时值的引用,这不起作用。
有关更多信息,请考虑:Default value to a parameter while passing by reference in C++
我正在解决 this 个问题。
当 min
和 max
变量被设置为全局变量时,我得到了正确的输出,但是当我在函数中传递它们时它弄乱了输出。
我想不通原因。 谁能告诉我,这两个代码片段有何不同。
global:
int min = 1,max = 0;
//dfs in which left subtree is travelled before right
void travLeft(Node * root, int i,vector<int> &left)
{
if(root==NULL) return;
if(i<min)
{
min = i;
left.push_back(root->data);
}
travLeft(root->left,i-1,left);
travLeft(root->right,i+1,left);
}
void travRight(Node * root, int i,vector<int> &right)
{
if(root==NULL) return;
if(i>max)
{
max = i;
right.push_back(root->data);
}
travRight(root->right,i+1,right);
travRight(root->left,i-1,right);
}
void topView(Node * root) {
vector<int> left,right;
travLeft(root,0,left);
travRight(root,0,right);
for(int i=left.size()-1;i>=0;i--)
{
cout<<left[i]<<" ";
}
for(int i=0;i<right.size();i++)
{
cout<<right[i]<<" ";
}
}
passing in the function :
//dfs in which left subtree is travelled before right
void travLeft(Node * root,int min, int i,vector<int> &left)
{
if(root==NULL) return;
if(i<min)
{
min = i;
left.push_back(root->data);
}
travLeft(root->left,min,i-1,left);
travLeft(root->right,min,i+1,left);
}
void travRight(Node * root,int max, int i,vector<int> &right)
{
if(root==NULL) return;
if(i>max)
{
max = i;
right.push_back(root->data);
}
travRight(root->right,max,i+1,right);
travRight(root->left,max,i-1,right);
}
void topView(Node * root) {
vector<int> left,right;
travLeft(root,INT_MAX,0,left);
travRight(root,0,0,right);
for(int i=left.size()-1;i>=0;i--)
{
cout<<left[i]<<" ";
}
for(int i=0;i<right.size();i++)
{
cout<<right[i]<<" ";
}
}
全局变量是全局的。对值的更改将在 travLeft
和 travRight
.
另一方面,参数是函数的局部参数。 min
和max
的新值被传递到下一级递归,但是min
的更新在第一个递归
travLeft(root->left,min,i-1,left);
不会传递给第二次递归
travLeft(root->right,min,i+1,left);
因为min
相同的值,在这一层被更新(或者不更新,来自上一层),被传递给两次调用。
max
和 travRight
.
这就是区别。
当用作全局变量时,更改将在所有层中发生(并保留更改)。但是,如果将它们传递给函数,对于每个递归阶段(层),变量将具有特定值,该值对于该特定层将保持不变。
@MikeCat 和@SoumitraChatterjee 已经说明了你的版本传入变量失败的原因
要使其工作,您可以选择将参数设置为将 min
和 max
作为参考,这样更改将反映为原始值:
void travLeft(Node* root, int& min, int i, vector<int> &left) { //... }
^^^^
请注意,为参数 max
和 min
设置默认值可能很诱人,例如:
// this doesn't work
// ↓ ↓ ↓ ↓ ↓ ↓
// void travLeft(Node* root, int i, vector<int> &left, int& min = 0)
但是,这将不起作用,因为您试图将 min
设置为临时值的引用,这不起作用。
有关更多信息,请考虑:Default value to a parameter while passing by reference in C++