【问题标题】:Passing a variable by reference to a recurring function通过引用循环函数传递变量
【发布时间】:2017-02-11 07:10:50
【问题描述】:

函数的参数是对在递归函数中处理的变量static 的引用吗?下面是一个在 BST 中查找第 k 个最小根的函数。

int findNode(TreeNode* root, int &k) {
    if(root == NULL)
        return -1;
    // We do an inorder traversal here.
    int k1 = findNode(root->left, k);
    if(k == 0) return k1; // left subtree has k or more elements.
    k--;
    if(k == 0) return root->val; // root is the kth element.
    return findNode(root->right, k); // answer lies in the right node.
}

int kthsmallest(TreeNode* root, int k) {
    return findNode(root, k);  // Call another function to pass k by reference.
}

函数kthsmallest返回第k个最小节点的值。

节点定义:

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
}

我的问题是为什么k 是通过引用传递的。

【问题讨论】:

  • 因为是在函数中修改的?并在 递归调用之后使用。
  • @Someprogrammerdude 如您所见,它没有在调用它的函数中使用。
  • 否,但递归调用可能会对其进行修改,然后在findNode函数内部使用。 findNode 也可以从其他地方调用?我建议你在调试器中单步调试代码,单步执行递归调用,看看到底发生了什么。
  • k-- 修改 k。该引用确保所有ks 都是相同的k
  • @user4581301 这就是我要问的。那么,通过引用传递 k 是否使其表现得像一个静态变量?否则,对于每个递归调用,它将有一个新副本,其中包含堆栈中的值。但是这里可能会出现堆栈中以前的值由于引用传递而被覆盖的情况。我说的对吗?

标签: c++ recursion pass-by-reference static-variables


【解决方案1】:

k 的含义与整体算法有关,而不是对findNode 的单独调用。它就像一个倒数计时器;当k 达到 0 时,算法终止。所有递归调用都参与相同的倒计时。

在调用范围内传递对变量的引用解决了与static 类似的问题,但它通常被认为是软件工程中的一种高级技术。全局变量(例如static)限制了程序的可扩展性。

这个故事的寓意是不要使用像k 这样的名字。称它为remaining_nodes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2019-07-30
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多