All is well

[YYBASIC0204/얌얌코딩] 재귀 함수에 대한 착각과 진실 본문

C++/YYBASIC

[YYBASIC0204/얌얌코딩] 재귀 함수에 대한 착각과 진실

D0YUN 2025. 2. 5. 19:02

재귀 함수

  • 재귀 함수는 함수가 호출될 때마다 기존 호출과는 별개의 새로운 함수 instance를 생성하는데, 이는 메모리 상에서 서로 다른 공간을 차지합니다.
  • 동일한 이름의 변수를 사용하는 두 개의 함수 instance가 존재할 수 있으며, 이는 각 호출이 독립적으로 실행되기 때문에 가능합니다.
    • ∴ 재귀 함수는 단순히 나 자신을 호출하는 것이 아니라, 코드를 복사하여 호출하는 것으로 이해하는 것이 좋습니다.

재귀 함수 작동 방식

  • 재귀 함수는 메모리에서 함수를 쌓는 구조로 작동합니다.
  • 이는 메모리 소모를 발생시키는데, 호출이 무한히 진행되면 메모리가 꽉 차게 되어 stack overflow가 발생하게 됩니다.
  • ∴ 재귀 함수에서는 최적의 성능을 위해 무한 호출을 방지하는 조건문을 설정해야 합니다.
//YYBASIC02_04
#include <iostream>
using namespace std;

/* [F11]을 이용하여 하나하나 다 보면서 공부하는 것을 추천 */

// 문제1 : 출력 결과가 0 1 2 3이 되게 Recursion 구현하기
#pragma region Recursion 1
void test1(int x)
{
    // 무한정 호출되는 함수를 방지하는 게 급선무
    if (x == 4)
    {
        return;
    }

    cout << x << ' ';
    test1(x + 1);
}
#pragma endregion


// 문제2 : 배열의 값을 출력하기
#pragma region Recursion 2
int arr[5] = {5, 7, 1, 2, 3};

void test2(int x)
{
    if ( x == size(arr) )
        return;

    cout << arr[x] << ' ';
    test2(x + 1);
}
#pragma endregion


void main()
{
    cout << "< Recursion >"<<endl;
    cout << "test1 : ";
    test1(0);

    cout << "\ntest2 : ";
    test2(0);
}

 

LV05 재귀함수에 대한 착각과 진실