Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

forest_moon

[Java] 팩토리얼과 재귀함수 본문

카테고리 없음

[Java] 팩토리얼과 재귀함수

rokga 2023. 4. 4. 16:52

팩토리얼

팩토리얼이란 차례대로 곱한 수로, 느낌표를 사용하여 나타냅니다.

# 팩토리얼 예
1! = 1 = 1
2! = 2 x 1 = 2
3! = 3 x 2 x 1 = 6
4! = 4 x 3 x 2 x 1 = 24

 

팩토리얼을 사용한 예제

입력)  4

public class Factorial {
  public static void main(String[] args) {

    int number = Integer.parseInt(args[0]);  // 입력값
    
    printFactorial(number);  //결과
  }

  public static void printFactorial(int n) {  // 정수 n을 입력받아 n!의 결과를 출력
    int result = 1;
    System.out.printf("%d! = ", n);
    for (int i = n; i > 0; i--) { 
      System.out.printf("%d", i);
      result *= i; 
      if (i != 1) {
        System.out.printf(" x ");
      }
    }
    System.out.printf(" = %d\n", result);
  }
}

출력)    4! = 4 x 3 x 2 x 1 = 24

 

 

위 와같은 방법을 통해 구하는 방법과 재귀호출을 이용해서 하는 방법이 있다.

 

재귀함수

재귀함수란?

함수가 직접 또는 간접적으로 자신을 호출하는 프로세스를 재귀함수라고 합니다

재귀 알고리즘을 이용하면 복잡한 문제들도 간단하게 해결할 수 있습니다

반복문도 마찬가지지만 재귀함수도 종료지점을 제대로 생각하지 않고 구현을 하면 스택오버플로우가 발생할 수 있으니 항시 주의해서 구현을 해줘야한다.

 

 

public class Function {
	public static void main(String[] args)  {
		int n = 5;
		System.out.print("1부터 " + n + "까지의 합계 : " + Sum(5));  // Sum 메서드 호출
	}
	
	
	public static int Sum(int n){
		if(n == 0)  // n이 0인 경우 return
			return 0;
		return n += Sum(n-1); // 재귀함수 시작
	}
}

(재귀함수를 사용해 구현할 수 있는 알고리즘으로 피보나치수열,팩토리얼,거듭제곱,최대 공약수 등이 있다 .)

 

 

 

재귀함수를 사용하는 이유.

재귀 함수는 for, while을 사용한 반복문으로 변경할 수 있고,

반대로 for, while을 사용한 반복문을 재귀 함수로 표현할 수 도 있다. 그리고 종료지점을 제대로 설정하지 않으면 스텍오버플로우가 발생.

 

그럼에도 사용하는 이유는

우선 가독성이다.  위 예 두가지를 비교해도 코드가 짧아지고 직관적으로 코드를 이해할 수 있게 된다.

그리고 변수의 사용을 줄여준다.

변수의 사용을 줄여준다는 것은 변수가 저장되는 메모리에 대한 이야기가 아니라 'mutable state(변경 가능한 상태)'를 제거하여 프로그램 오류가 발생할 수 있는 가능성을 줄여준다는 이야기이며, 이는 변수의 수를 줄이는 것뿐만 아니라 변수가 가질 수 있는 값의 종류 또는 범위도 제한하게 되어 함수를 단순하게 만들고, 불변적으로 유지될 수 있도록 합니다.

 

 

Reference 

https://wildeveloperetrain.tistory.com/116