2023-12-28 (15일차) - 계산기 만들기, 재귀함수

민짱·2024년 1월 7일
post-thumbnail

📅2023. 12. 28 15일차


🎨 Java

재귀함수 (Recursion Function)란?

  • 함수 내부에서 ‘자기 자신을 호출’하는 함수를 의미한다. 이를 통해서 함수가 자신을 반복적으로 호출하면서 원하는 결과를 도출할 수 있다.

호출스택 (Call Stack)이란?

  • 프로그램에서 함수나 메서드를 호출할 때 해당 함수나 메서드의 실행이 끝날 때까지 실행되는 다른 함수나 메서드의 호출 정보를 저장하는 자료이다.
  • 이 스택은 함수가 호출될 때마다 그 함수의 호출 정보를 저장하고 함수의 실행 결과가 반환되면 해당 함수의 호출 정보를 스택에서 제거한다.
  • 호출 스텍은 디버깅, 예외 처리 및 재귀 함수와 같은 다양한 프로그래밍 작업에 사용된다.

⌛ 팩토리얼 계산 방법

💡 팩토리얼 이란?

  • 자연수 n에 대해서 1부터 n까지의 모든 자연수를 곱한 값을 의미한다.
public class Main {
    public static void main(String[] args) {
        System.out.println(factorial(5)); // 5! = 5 * 4 * 3 * 2 * 1 = 120
    }

    public static int factorial(int n) {
        if (n == 0) { // 기본 케이스
            return 1;
        } else { // 재귀 케이스
            return n * factorial(n - 1);
        }
    }
}

⌛ N 자연수의 합 계산 방법

public class Main {
    public static void main(String[] args) {
        System.out.println(sumNaturalNumber(5)); // 15
    }

    public static int sumNaturalNumber(int n) {
        if (n == 1) {
            return 1;
        } else {
            return n + sumNaturalNumber(n - 1);
        }
    }
}

⌛ 거듭제곱(pow) 계산

public class Main {
    public static void main(String[] args) {
        System.out.println(power(2, 5)); // 15
    }

    public static int power(int base, int exponent) {
        if (exponent == 0) {
            return 1;
        } else {
            return base * power(base, exponent - 1);
        }
    }
}

⌛피보나치 수열 : 경우의 수 계산

public static int fibonacci(int n) {
    if (n == 0) {
        return 0;
    } else if (n == 1) {
        return 1;
    } else {
        return fibonacci(n-1) + fibonacci(n-2);
    }
}

✨ 계산기 만들기)

  • 문제 -(8 + 2) * -(7 + 3) + 5
String exp = "-(8 + 2) * -(7 + 3) + 5";

int startPos = 0;
int endPos = 7;

String head = exp.substring(0, startPos);
String body = "(" + exp.substring(startPos + 1, endPos + 1) + " * -1)";
String tail = exp.substring(endPos + 1);

    System.out.println("head : " + head);
    System.out.println("body : " + body);
    System.out.println("tail : " + tail);

    System.out.println("전체 : " + head + body + tail);
  • 머리, 몸통, 꼬리로 나눠서 계산 후 다시 결합

재귀호출 되는 구조를 쉽게 파악하기 위해 recursionDebug 활용

public static boolean debug = false;
public static int runCallCount = 0;

public static int run(String exp) {
	runCallCount++;
 
	if(recursionDbug) {
		System.out.printf("exp(%d) : %s\n", runCallCount, exp)
    }
}
  • 출력문을 활용하여 실행문이 돌 때마다 몇번 도는지, 돌때마다 테스트케이스가 어떻게 연산을 하는지 변수와 출력문을 활요하여 눈으로 확인 할 수 있다.
  • boolean debug를 false에서 true로 바꿔주면 debug모드를 수동으로 키는 것 처럼 테스트케이스 연산을 추적하여 보여준다.

🔔 TODO

  • 지금까지 계산기 구현 기능 로직 복습하기
  • 재귀함수 찾아보기

0개의 댓글