본문 바로가기

프로그래밍/JUNGLE

[C] 재귀함수를 만드는 Global 변수 vs argument

C로 코딩을 하다가, 문득 문제를 만났다!!

짜고자 하는 함수는, tree의 중위순회한 결과 (작은 값부터 오름차순으로)를
arr에 담아주는 함수이다.

함수는 짧으니 아래를 보며 이해하자!

int i = 0;
int inorder_array(node_t *n, key_t *arr) {
  if (n) {
    inorder_array(n -> left, arr);
    // printf("%d \n %d \n", n -> key, i);
    arr[i++] = n -> key;
    inorder_array(n -> right, arr);  
  }
  return 0;
}

이렇게 짤 경우, int i = 0 이라고 i라는 global 변수를 선언했다.
그래서 함수 내부에서 i 값을 증가시키고, arr[i]에 중위순회의 값을 넣어주는 방식이다 (즉, i는 index이다)

재귀적으로 함수를 짜기 위해서, global 변수를 선언하여 index역할을 하게 했는데
이런 경우 global 변수 없이는 재귀를 사용할 수 없는건지 궁금해졌다!

해서 코치님에게 여쭤봤고, 다음과 같은 코드를 알려주셨다.

int inorder_array(node_t *n, key_t *arr, size_t *c_ptr) {
  if (n) {
    inorder_array(n -> left, arr, c_ptr);
    // printf("%d \n %d \n", n -> key, i);
    arr[*c_ptr] = n -> key;
    (*c_ptr)++;
    inorder_array(n -> right, arr, c_ptr);  
  }
  return 0;
}

이렇게 사용할 경우, c_ptr 변수의 주소값을 함수의 인자로 받아서 그 주소값에 해당하는 값을 변경해줄 수 있다.
이러면 global 변수를 사용하지 않고 함수의 argument를 이용해서 재귀적으로 코드를 짤 수 있다!

 

C언어에서 포인터함수 개념을 배우면서 가장 중요하고 기초적인 개념인데 이걸 까먹다니 ㅠㅠ
포인터를 잘 사용하면 global처럼 사용할 수 있다는 사실!!!!

 

오늘의 큰 배움

'프로그래밍 > JUNGLE' 카테고리의 다른 글

PintOS project2. User Program  (0) 2021.10.14
PintOS project1. Threads  (0) 2021.10.04
RB Tree 삽입  (0) 2021.09.08
이진 탐색 트리(Binary Search Tree) C로 구현하기  (0) 2021.09.06
RB Tree [레드 블랙 트리]  (2) 2021.09.03