递归函数中自定义参数和全局变量,参数与参数引用区别

举例来说 ,在一棵树上求mu'b目标值为target的路径,对于参数有这样集中应用情况

1.全局变量记录当前路径之和sum,存储当前节点的vector<int>也可以当成全局变量

我们每一次都是改变的这个全局变量,所以dang当我们遍历到最后时,不符合要求的时候,都要把路径上计算过的值和结点一并抛出pop和--,当然对于参数中存在引用lai'来说也是同样道理,因为引用其实就相当于直接改变这个数,而普通的传值参数只会开辟新的空间,而不改变上一个递归函数的值,所以在这方面上来说,引用和全局变量没什么区别

//引用的处理过程  
void helper(TreeNode *root,int sum,vector<vector<int>>&res,vector<int>&temp)
    {
        if(root==NULL)
            return;
        temp.push_back(root->val);
         if(!root->left&&!root->right&&sum-root->val==0)
                res.push_back(temp);
        helper(root->left,sum-root->val,res,temp);
         helper(root->right,sum-root->val,res,temp);
 
 
        temp.pop_back();
 
 
    }

两个数组都是引用,直接gai'改变他们自身,sum为传值,这一时刻改变值不会影响上一刻大小,因为这是两个不同的空间,在函数调用的时候,zhi'只不过把当前空间的bian变量复制,然后用这个复制的值来进行下一时刻的递归调用

//全局变量的处理过程
nt currentSum = 0;  
vector<Node *> path;

void traverse(Node *root, int expectedNum) {
    if(root==NULL) return;

    currentSum += root->value;  
    path.push_back(root);  
    //如果是叶节点,并且路径上结点的和等于输入的值  
    if(root->left == NULL && root->right == NULL) {  
        if(currentSum == expectedNum) {  
            show(path);  
            cout << currentSum <<endl;  
        }  
    }  

    traverse(root->left, expectedNum);  
    traverse(root->right, expectedNum);  

    currentSum -= root->value;   // 必须恢复,所有函数调用使用同一个值  
    path.pop_back();[/color]  
}  

2.函数内定义的变量和下一次递归调用的同名变量是不一样的,ji经过层层调用的递归函数,在其内部的自定义汴玲互不影响,因为他们在栈中的地址是不同的,由栈顶逐渐移步到栈底,上一时刻既不能影响下一刻,下一刻也不能影响上一刻,除非有return,注意return的是这个bi变量的复制体,而不是本身,因为本身在函数运行结束完之后,也就随之结束,所以就不能用引用,也不能返回引用,只能返回值

那么定义自变量大部分函数为了能够承接下一时刻的返回值作为衔接,这个值可以通过函数传递到下一时刻

3.普通的函数参数,其实这种就和在哈市农户定义的ne内部参数一样,要不然怎么还能作为传值参数传到下一个方恒,hu'b互不影响而已

oid traverse(Node *root, int currentSum, vector<Node *> path, int expectedNum) {
    if(root==NULL) return;

    currentSum += root->value;  
    path.push_back(root);  
    //如果是叶节点,并且路径上结点的和等于输入的值  
    if(root->left == NULL && root->right == NULL) {  
        if(currentSum == expectedNum) {  
            show(path);  
            cout << currentSum <<endl;  
        }  
    }  

    traverse(root->left, currentSum, path, expectedNum);  
    traverse(root->right, currentSum, path, expectedNum);  

    // 不必恢复  currentSum, path,各函数调用层独立使用  
}  

猜你喜欢

转载自blog.csdn.net/qq_40086556/article/details/81735528