通过对循环函数的引用传递变量
Passing a variable by reference to a recurring function
作为对变量引用的函数的参数是否在递归函数中被处理 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
returns第k小节点的值。
节点定义:
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
}
我的问题是为什么 k
通过引用传递。
k
的含义与整体算法有关,与对findNode
的个别调用无关。它就像一个倒数计时器;当 k
达到 0 时算法终止。所有递归调用都有助于相同的倒计时。
在调用范围内传递对变量的引用解决了与 static
类似的问题,但它通常被认为是软件工程中的高级技术。全局变量(例如 static
)限制程序的可扩展性。
故事的寓意是不要使用像 k
这样的名字。将其命名为 remaining_nodes
.
作为对变量引用的函数的参数是否在递归函数中被处理 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
returns第k小节点的值。
节点定义:
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
}
我的问题是为什么 k
通过引用传递。
k
的含义与整体算法有关,与对findNode
的个别调用无关。它就像一个倒数计时器;当 k
达到 0 时算法终止。所有递归调用都有助于相同的倒计时。
在调用范围内传递对变量的引用解决了与 static
类似的问题,但它通常被认为是软件工程中的高级技术。全局变量(例如 static
)限制程序的可扩展性。
故事的寓意是不要使用像 k
这样的名字。将其命名为 remaining_nodes
.