C#에서 재귀 호출 이해하기

2023. 8. 30. 11:50·C#/Algorithm
반응형

재귀는 일단 이해되면 많은 문제에 대한 접근 방식을 크게 단순화할 수 있는 개념입니다. 이를 제대로 파악하기 위해 더 많은 예제를 살펴보고 C#에서 재귀 호출이 작동하는 방식을 자세히 살펴보겠습니다.

 

재귀란 무엇입니까?

 

프로그래밍에서의 재귀란 문제를 더 작고 관리하기 쉬운 하위 문제로 나누어 문제를 해결하기 위해 직접 또는 간접적으로 자신을 호출하는 함수를 말합니다. 재귀 함수에는 일반적으로 무한 루프에 빠지지 않도록 종료 조건이 있습니다.

 

거듭제곱

이 작업은 숫자의 거듭제곱을 계산하는 것입니다. 예를 들어, '3'을 '4'(3^4) 거듭제곱하면 '3 * 3 * 3 * 3 = 81'이 됩니다.

재귀를 사용하여 이 문제를 해결하는 방법은 다음과 같습니다.

 

public static int Power(int baseNumber, int exponent)
{
    // Termination condition
    if (exponent == 0)
        return 1;

    return baseNumber * Power(baseNumber, exponent - 1);
}

Power(3, 4)가 호출되는 경우:

  1. 3 * Power(3, 3)를 반환합니다. 이는 3 * (3 * Power(3, 2))가 됩니다.
  2. 계속해서 분석하면 '3 * (3 * (3 * Power(3, 1)))' 입니다.
  3. 마지막으로 '3 * (3 * (3 * (3 * Power(3, 0))))' 입니다.
  4. 종료 조건으로 인해 Power(3, 0)은 1을 반환합니다. 따라서 최종 계산은 3*3*3*3이 된다.

 

피보나치 수열

 

피보나치 수열은 숫자가 '0'과 '1'부터 시작하여 앞의 두 숫자의 합인 일련의 숫자입니다.

피보나치 수열에 대한 재귀 :

public static int Fibonacci(int n)
{
    // Termination conditions
    if (n <= 1)
        return n;

    return Fibonacci(n - 1) + Fibonacci(n - 2);
}
  1. 5 * Factorial(4)를 반환합니다.
  2. 분해하면 5 * (4 * Factorial(3))을 얻습니다.
  3. 게다가 5 * (4 * (3 * Factorial(2)))입니다.
  4. 마지막으로 5 * (4 * (3 * (2 * Factorial(1))))로 변합니다.
  5. Factorial(1)은 종료 조건에 따라 1을 반환합니다. 따라서 최종 답은 '5 * 4 * 3 * 2'입니다.

 

배열 요소의 합

 

이 문제를 해결하기 위해 우리는 배열의 크기를 계속해서 줄여서 배열의 나머지 부분의 합에 첫 번째 요소를 추가합니다.

public static int ArraySum(int[] arr, int n)
{
    // Termination condition
    if (n <= 0)
        return 0;
    
    return ArraySum(arr, n - 1) + arr[n - 1];
}

 

n = 4인 배열 [2, 4, 6, 8]의 경우:

 

  1. 함수는 ArraySum([2, 4, 6, 8], 3) + 8을 반환합니다.
  2. 추가로 ArraySum([2, 4, 6, 8], 2) + 6 + 8을 반환합니다.
  3. 계속하면 ArraySum([2, 4, 6, 8], 1) + 4 + 6 + 8이 됩니다.
  4. 마지막으로 n <= 0일 때 종료 조건이 0을 제공하므로 0 + 2 + 4 + 6 + 8입니다.

 

결론

재귀를 단계별로 시각화하면 그 자체가 이해하기 쉬워집니다. 재귀적 솔루션의 우아함은 종종 문제를 분석하는 단순성에서 비롯됩니다. 그러나 깊은 재귀에 대한 스택 오버플로 오류나 추가로 최적화할 수 있는 비효율적인 솔루션과 같은 함정에 항상 주의해야 합니다.

저작자표시 비영리 변경금지 (새창열림)

'C# > Algorithm' 카테고리의 다른 글

허프만 알고리즘(Huffman Algorithm)  (0) 2023.08.31
최소 신장 트리 : Kruskal Algorithm  (0) 2023.07.11
선택 정렬 : Selection sort  (0) 2023.07.11
버블 정렬 : Bubble sort  (0) 2023.07.11
무차별 대입 알고리즘 : Brute Force  (0) 2023.07.10
'C#/Algorithm' 카테고리의 다른 글
  • 허프만 알고리즘(Huffman Algorithm)
  • 최소 신장 트리 : Kruskal Algorithm
  • 선택 정렬 : Selection sort
  • 버블 정렬 : Bubble sort
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (725)
      • 스마트팜 (0)
      • 상품 추천 (223)
      • MongoDB (4)
      • 하드웨어 (17)
      • 일기장 (4)
      • 파이썬 (130)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (51)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    셀레니움
    rtsp
    programming101
    unity
    믈레코비타멸균우유
    긴유통기한우유
    리스트
    리뷰관리
    스마트스토어리뷰
    Python
    list
    리뷰이관
    스크립트 실행
    devlife
    appdevelopment
    codingtips
    cv2
    쇼핑몰리뷰
    상품 리뷰 크롤링
    codingcommunity
    카페24리뷰
    파이썬
    learntocode
    ipcamera
    유니티
    스크립트 실행 순서
    C#
    programmerlife
    라떼우유
    카페24리뷰이관
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
C#에서 재귀 호출 이해하기
상단으로

티스토리툴바