2017-02-11 10 views
0

순환 함수에서 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 번째로 작은 노드의 값을 반환합니다.

노드 정의 : k는 참조에 의해 전달되는 이유

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

내 질문입니다.

+2

기능이 수정 되었기 때문에? 그리고 * 재귀 호출 후에 *를 사용했습니다. –

+0

@Someprogrammerdude 볼 수있는 함수에서 사용되지 않습니다. – Gyanshu

+1

아니요, 그러나 재귀 호출은이를 수정할 수 있으며, findNode 함수 내에서 사용됩니다. 그리고'findNode'는 다른 장소에서도 호출 될 수 있습니다. 디버거에서 코드를 단계별로 실행하여 재귀 호출을 수행하여 실제로 발생하는 것을 확인하는 것이 좋습니다. –

답변

2

k의 의미는 findNode에 대한 개별 호출이 아니라 전체 알고리즘과 관련이 있습니다. 카운트 다운 타이머와 같습니다. 알고리즘은 k이 0에 도달하면 종료됩니다. 모든 재귀 호출은 동일한 카운트 다운에 기여합니다.

호출 범위에서 변수에 대한 참조를 전달하면 static과 비슷한 문제가 해결되지만 일반적으로 소프트웨어 엔지니어링에서 우수한 기술로 간주됩니다. 전역 (예 : static)은 프로그램의 확장 성을 제한합니다.

이야기의 도덕은 k과 같은 이름을 사용해서는 안됩니다. 그것을 remaining_nodes과 같은 것으로 부르십시오.