forest_moon
[Java] 팩토리얼과 재귀함수 본문
팩토리얼
팩토리얼이란 차례대로 곱한 수로, 느낌표를 사용하여 나타냅니다.
# 팩토리얼 예
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