본문 바로가기
알고리즘

[알고리즘] Java 팩토리얼(factorial) 구하기. (for문, 재귀함수)

by Alkaloid 2021. 4. 27.
반응형
반응형

팩토리얼의 구조를 살펴보자

정수: 5가 입력이 되었을 때, 5*4*3*2*1이된다. 즉 답은 120이 나오게 된다.

정수: 459가 입력이 되었을 때는 459*458*457*....1이 답이 된다.

 

그럼 N이 입력 되었을때, N*(N-1)*(N-2)...로 가서

(N-1)=1이 될때까지 반복을 하게 될것이다.

 

이것을 해결하기 위해 하나하나 해보도록 하겠다.

 

1. 첫번째 조건 : 숫자를 입력받는다.

c같은 경우는 scanf();

java같은 경우는 sc.nextInt(); 를 통해 받게 될것이다.

 

※앞으로의 설명은 Java로 풀이 할것이다.

 

입력을 받아야 하기 때문에 Scanner를 사용해야한다.

 

import java.util.*;    //보통 java.util.Scanner;를 쓰지만 *는 모든것을 사용하겠다는 의미가 되기 때문에 간편하다.

(생략)....(String[] args){       //기본 구조안에 작성해야한다.

Scanner sc = new Scanner(System.in);

int num = sc.nextInt();

}

 

스캐너 인스턴스를 생성하고, num이라는 변수안에 int형을 사용자에게 받았다.

 

 

2. 두번째 조건: 입력받은 만큼 -1을 하면서 곱셈을 해야한다.

for문으로 작성시 여기서 두가지 경우가 나온다.

-입력받은수 -1씩하여 계산하기.

-입력받은수까지 +1을 하여 계산하기.

 

//입력받은수 -1씩하여 계산

for(int i=num;i>=1;i--){

 

}

 

3. 세번째 조건: 계산한 값을 담을 변수를 준비해야한다.

계산이 되었을때, 해당 값을 저장할 변수를 만들어야한다.

해당 변수를 초기화해야하는데, 0일때는 for문안에서 계산이 안되기 때문에 1로 초기화한다.

 

int result=1;

for(int i=num;i>=1;i--){

    result *= i;                //이 부분이 추가된것 이다.

}

 

4. 네번째 조건: 최종 값을 출력한다.

system.out.println(result);

 

끝이다. 그럼 위에서 설명한 다른 방법인 입력받은 값에서 점차 +1을 하여 계산하는 방법 또한 비슷하다.

 

조건이 바뀌는 것이기 때문에 2번만 바꿔주면된다.

 

 

2. 두번째 조건: 입력받은 만큼 +1을 하면서 곱셈을 해야한다.

 

//입력받은수 +1씩하여 계산

for(int i=1;i<=num;i++){

 

}

 

이 안에는 위와 똑같이 result *= i; 가들어갈 것이고, 출력 또한 같을 것이다.

 


다른 방법인 재귀함수를 이용해 코드를 작성해보겠다.

 

재귀함수는 같은 일에 반복 작업을 할때 쓰인다.

즉, 자기자신을 호출하여 같은 일을 반복하는것이다.

 

그럼 아까와 같이 

1. 입력 및 변수를 선언

Scanner sc = new Scanner(System.in);

int num = sc.nextInt();

int result = 0;        //여기서 0인 이유는 result를 가지고 계산을 하지 않기 때문에 0으로 초기화 하였다.

 

2. 재귀함수 호출

result = 자신이 정한 함수명(num);

 

3. 재귀함수 선언

public static int 자신이 정한 함수명(int num){

}

 

4. 재귀함수 구현

public static int 자신이 정한 함수명(int num){

 return num*자신이 정한 함수명(num-1);    //이 부분이 추가된것 이다.

}

 

5. 재귀함수 탈출

조건을 주지 않으면 재귀함수를 탈출하지 못한다.

if(num==1){

      return 1;

}

 

 

4번과 5번을 합치면 재귀함수는

 

public static int 자신이 정한 함수명(int num){

if(num==1){

      return 1;

}

 return num*자신이 정한 함수명(num-1);  

}

 

최종적으로 이런 모양이 나온다

 

6. 출력

system.out.println(result);

 

 

반응형