factorial(N) / (factorial(N - K) * factorial(K))
팩토리얼이란?
: ‘수를 단계적으로 곱한다.’는 뜻으로 숫자 옆에 !표를 붙어서 표현
함수 내부에서 해당 함수가 다시 호출되는 것을 의미
이러한 호출은 자기자신을 계속호출하기 때문에 끝없이 반복될 수 있으며 반드시 재귀호출을 중단하도록 조건 명령문을 반드시 포함
재귀호출을 사용하는 이유는 코드의 목적과 가독성 때문
반복문으로 표현된 경우, 이 반복문이 어떤 목적인지 코드를 모두 해석해야 의미를 파악 가능
1 ~ 10까지 곱하는 프로그램을 만든다고 가정할 때
1 ~ 10까지의 곱은 1 ~ 9까지의 곱의 곱하기 10
1 ~ 9까지의 곱은 1 ~ 8까지의 곱의 곱하기 9
1 ~ 8까지의 곱은 1 ~ 7까지의 곱의 곱하기 8
...
1 ~ 2까지의 곱은 1 ~ 1까지의 곱의 곱하기 2
마지막으로 1 ~ 1까지의 곱은 1
이를 코드로 작성하면
1. n 이 1이 아니면, n 과 1 부터 n-1 까지의 곱을 곱한 값을 반환
2. n 이 1이면, 1을 반환
public static void main(String[] args) {
int result = factorial(10);
System.out.println(result);
}
static int factorial(int N) {
if (N == 1) {
return 1;
} else {
return N * factorial(N - 1);
}
} // 3628800 출력
static int factorial(int N) {
if (N <= 1) { // factorial(0) == 1
return 1;
} else {
return N * factorial(N - 1);
}
}
System.out.println(factorial(N) / (factorial(K) * factorial(N - K)));
int up = factorial(N); // 분자
int down = factorial(K) * factorial(N - K); // 분모
int result = up / down;
System.out.println(result);
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int K = sc.nextInt(); int up = factorial(N); // 분자 int down = factorial(K) * factorial(N - K); // 분모 int result = up / down; System.out.println(result); // System.out.println(factorial(N) / (factorial(K) * factorial(N - K))); } static int factorial(int N) { if (N <= 1) { // factorial(0) == 1 return 1; } else { return N * factorial(N - 1); } } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int K = sc.nextInt(); System.out.println(factorial(N) / factorial(K) * factorial(N - K)); static int factorial(int N) { if (N <= 1) { // factorial(0) == 1 return 1; } else { return N * factorial(N - 1); } } }
1시간 넘게 왜 틀렸는지 찾아봐도 답이 나오지 않아 다른 사람에게 보여줬는데 아주 간단한 코드에서 문제가 있었다는 것을 발견
factorial(N) / factorial(K) * factorial(N - K)
factorial(K) * factorial(N - K) 식이 수학문제를 푸는 것처럼 당연히 분모로 내려간다고 생각해 ()기 필요하다라는 생각을 못함
헷갈림을 방지하기 위해 아래의 코드와 같이 분모, 분자를 나눠서 코드를 만드는 것도 하나의 방법이라는 걸 깨닫게 됨
int up = factorial(N); // 분자 int down = factorial(K) * factorial(N - K); // 분모 int result = up / down; System.out.println(result);