2017-02-11 15 views
0

Является аргументом для функции, которая является ссылкой на обработанную переменную static в рекурсивной функции? Ниже приведена функция для нахождения k-го наименьшего корня в BST.Передача переменной по ссылке на возвращаемую функцию

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 возвращает значение наименьшего -го узла.

определение Node:

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

Мой вопрос, почему k передается по ссылке.

+2

Потому что он изменен в функции? И использовал * после * рекурсивный вызов. –

+0

@Someprogrammerdude Он не используется в функции, которая называется так, как вы можете видеть. – Gyanshu

+1

Нет, но рекурсивный вызов может изменить его, а затем он используется внутри функции 'findNode'. И «findNode» можно было бы вызвать из других мест, а может быть? Я предлагаю вам выполнить код в отладчике, вступая в рекурсивные вызовы, чтобы увидеть, что на самом деле происходит. –

ответ

2

Значение k относится к общему алгоритму, а не индивидуальному вызову findNode. Это похоже на таймер обратного отсчета; алгоритм завершается, когда k достигает 0. Все рекурсивные вызовы способствуют тому же обратному отсчету.

Передача ссылки на переменную в области вызова решает аналогичную проблему, как static, но, как правило, она считается превосходной техникой в ​​разработке программного обеспечения. Глобалы (например, static) ограничивают масштабируемость программы.

Мораль этой истории заключается не в использовании таких имен, как k. Назовите это что-то вроде remaining_nodes.

 Смежные вопросы

  • Нет связанных вопросов^_^