본문 바로가기
C++/기초

C++ 기초 : 함수 (3)

글: 시플마 2024. 2. 26.

Factorial(팩토리얼)이라고 아시나요?

 

Factorial은 그 수보다 작거나 같은, 모든 양의 정수의 곱입니다.

 

양의 정수 뒤에 '!'를 붙여 표현하죠.

 

예를 들어 4!

4 * 3 * 2 * 1 = 24 입니다.

 

 

이를 코드로 표현해 보겠습니다.

int main()
{
  //4! ( Factorial )
  int iValue = 4 * 3 * 2 * 1;
    
  return 0;
}

 

변수 iValue에는 4!을 한 값인 24가 들어갈 겁니다.

 

 

 

 

 


 

 

 

 

 

그런데 만약 10!한 값을 iValue에 넣고 싶다고 했을 때

일일이 10부터 1까지 입력하는 건 번거롭습니다.

 

 

팩토리얼 계산을 for 문을 통해 조금 더 편하게 해볼까요?

int main()
{
  //4! ( Factorial )
  int iFactorial = 4;
  
  //Factorial한 결괏값이 들어갈 변수 선언
  int iValue = 1;
  
  for(int i = 0; i < iFactorial - 1; i++ )
  {
    iValue *= (i + 2);
  }
    
  return 0;
}

 

변수 iFactorial은 팩토리얼을 진행할 숫자를 담는 변수입니다.

 

iFactorial에 담긴 숫자를 팩토리얼한 후, 그 결괏값을 변수 iValue에 담을 것입니다.

 

for 문을 살펴보면

i가 0부터 시작하여 (4 - 1) 미만인 경우,

즉 0부터 시작하여  3 미만인 경우 1씩 증가하며 

반복하게 구성하였습니다.

 

 

조건식에서 팩토리얼할 수에서 1을 빼는 이유는

4!을 계산할 때

 

세 번의 곱셈이 진행됩니다.

 

어떤 수가 와도 팩토리얼할 수에서 1을 뺀 횟수만큼 

곱셈을 진행하기 때문에 조건식을 위 코드와 같이 구성하는 것입니다.

 

 

코드대로라면 i값이 0, 1, 2까지 올라가면서 반복하다가, 즉 세 번 반복하고

3이 되는 순간 for 문을 빠져나오겠네요.

 

 

for 문이 처음 돌 때 과정을 보면,

iValue의 값은 1입니다. 이 값과 (i + 2)를 곱해 다시 iValue에 대입합니다.

1 * (0 + 2) = 2이므로 2를 대입하겠죠.

 

그리고 i값이 1 증가합니다.

 

 

 

 

 

i의 값은 현재 1입니다. 3 미만이므로 for 문을 더 진행합니다.

iValue의 값은 현재 2입니다. 이 값과 (i + 2)를 곱해 다시 iValue에 대입합니다.

2 * (1 + 2) = 6이므로 6을 대입하겠죠.

 

그리고 i값이 1 증가합니다.

 

 

 

 

 

i의 값은 현재 2입니다. 3 미만이므로 for 문을 더 진행합니다.

iValue의 값은 현재 6입니다. 이 값과 (i + 2)를 곱해 다시 iValue에 대입합니다.

6 * (2 + 2) = 24이므로 24를 대입하겠죠.

 

그리고 i값이 1 증가합니다.

 

 

 

 

i의 값은 현재 3입니다. 3 미만이 아니고 3과 같으므로 for 문을 빠져나옵니다.

 

의도한대로 4!의 결괏값인 24가 변수 iValue에 대입되었습니다.

 

 

 

 

 


 

 

 

 

 

처음에는 팩토리얼을 계산하기 위해 일일이 숫자를 적어야 했지만

for 문을 사용하니, 팩토리얼할 숫자만 넣어주면 알아서 계산이 되죠.

 

충분히 간편해졌습니다.

 

 

그런데 프로그램을 만들다 보니,

팩토리얼 계산을 해야 하는 경우가 많아졌습니다.

int main()
{
  //4! ( Factorial )
  int iFactorial = 4;
  
  //Factorial한 결괏값이 들어갈 변수 선언
  int iValue = 1;
  
  for(int i = 0; i < iFactorial - 1; i++ )
  {
    iValue *= (i + 2);
  }
  
  
    //10! ( Factorial )
  int iFactorial1 = 10;
  
  //Factorial한 결괏값이 들어갈 변수 선언
  int iValue1 = 1;
  
  for(int i = 0; i < iFactorial1 - 1; i++ )
  {
    iValue1 *= (i + 2);
  }
  
  
    //12! ( Factorial )
  int iFactorial2 = 12;
  
  //Factorial한 결괏값이 들어갈 변수 선언
  int iValue2 = 1;
  
  for(int i = 0; i < iFactorial2 - 1; i++ )
  {
    iValue2 *= (i + 2);
  }
    
  return 0;
}

 

필요할 때마다 팩토리얼을 계산하는 for 문을 넣었더니

코드가 상당히 길어졌으며 가독성이 떨어졌습니다.

 

 

그렇다면 팩토리얼을 계산하는 for 문을 함수로 구성하면 어떨까요?

int Factorial(int _iNum)
{
  int iReturnValue = 1;
  
  for(int i = 0; i < _iNum - 1; i++ )
  {
    iReturnValue *= (i + 2);
  }
  
  return iReturnValue;
}

int main()
{
  //4! ( Factorial )
  int iValue = Factorial(4);

  //10! ( Factorial )
  int iValue1 = Factorial(10);
  
  //12! ( Factorial )
  int iValue2 = Factorial(12);
  
  return 0;
}

 

팩토리얼을 계산하는 for 문을 Factorial이라는 이름의 함수로 구성하였습니다.

 

Factorial 함수에 팩토리얼 계산을 진행할 숫자를 넘겨주면

받은 숫자를 변수 _iNum에 대입한 후, 팩토리얼 계산을 진행합니다.

그 값을 변수 iReturnValue에 넣은 후 반환합니다. 

 

반환된 값은 각각 변수 iValue, iValue1, iValue2에 대입됩니다.

 

 

 

디버깅 결과를 봅시다.

 

팩토리얼 계산도 정확하게 이루어졌고 코드도 훨씬 깔끔해졌습니다.

 

 

 

이처럼 필요한 기능을 함수로 구성하면 가독성이 좋아집니다. 

 

또한 사용하고자 하는 기능을 찾아 코드를 복사하여 사용할 필요 없이 

함수의 이름만 알고 있다면 간단하게 호출하여 사용할 수 있습니다.

 

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB