1. for루프 팩토리얼 (for loop factorial)

*팩토리얼은 자연수를 1부터 차례로 곱한다는 의미이다. 보통은 1,2,3, ... (n-1), n 까지 곱할때 n! (느낌표라고 쓰고 팩토리얼이라고 읽음) 라고 표기한다.

 

파이썬 알고리즘으로 구하는 방법은 여러가지 방법이 있다. 이 포스트에서는 for 루프와 재귀함수를 활용한다. 

 

1) for 기본코드

 

매개변수는 두개가 필요하다. 시작점과 끝점이다. 그런데 자연수니까 1부터 시작한다. 실제 매개변수는 끝의 숫자만 필요하다. 또 결과값을 저장할 변수가 필요하다. 

 

끝점 : for 문의 range 같은 경우 range(1, n +1) 의 n 이다. range(n+1)의 n+1은 종료하는 값

결과값 변수 : result = 1 곱하기니까 1부터 시작한다.

def factorial(num):
    result = 1
    for i in range(1,num+1):
        result *= i
    return result

ftnum = int(input("input factorial number: "))
print(factorial(ftnum))

2) for 출력코드

 

곱의 과정을 보여준다. 0! 을 1로 정의하므로 for루프 전에 출력한다.

def factorial(num):
    result = 1
    print(0, "! :", result, sep='')

    for i in range(1,num+1):
        result *= i
        print(i,"! :",result,sep='')
    return result

ftnum = int(input("enter factorial number: "))
factorial(ftnum)

 

2. 재귀함수 팩토리얼 (recursive factorial)

재귀함수는 자기 자신을 스스로 호출하는 함수이다. 마치 거울처럼 자기 자신을 부르는 특이한 함수를 재귀함수 - recursive function - 이라고 한다.

 

1) if문 사용

 

함수안에서 끝낼 것이기 때문에 일단 함수를 정의한다. 일단 0이나 1은 1이므로 if문에서 반환값을 1로 고정한다. 이 if문이 마지막으로 부르는 재귀함수가 된다. 쉽게말해 종료조건이 된다.

 

2가 들어왔을 때 부터 결과는 달라진다. 2와 함수(num-1)의 곱이다. num은 2이므로 함수(1) 은 1을 리턴. 2는 2*1이다.

3이 들어오면 리턴값이 3 * 함수(3-1) 이다. 여기서 함수(3-1)이 자기 자신을 호출하는 형식이다. 그림으로 보면 아래와 같다.

 

단지 코드가 작동하는 방식은 f(5)에서 시작되었다 그러면 return 문에 가서 f(5)를 리턴하기 전에 f(4)를 호출하고 f(4)는 f(3)을, f(3)은 f(2)를 호출하고 f(2)는 리턴하기 전에 f(1)을 호출한다. 여기서부터 f(1)은 실제 결과값을 리턴하면서 종료를 시킨다. f(1) >> f(2) >> f(3) >> f(4) >> f(5) 까지 종료되면 120을 반환하고 코드는 종료한다. 재귀함수는 연속적으로 함수를 열면서 들어가다가 어느 시점에 반전이 되면 열려져있는 함수를 닫으면서 종료한다.  

 

def re_factorial(num):
    if num <= 1:
        return 1
    return num * re_factorial(num-1)

n = int(input("enter factorial number: "))
print(re_factorial(n))

2) if else문 사용

 

1)번과 문법적인 부분만 바꿔서 보기좋게 출력한다. 원리는 같다.

def re_factorial(num):
    if num > 1:
        return num * re_factorial(num-1)
    else:
        return 1

n = int(input("factorial number: "))

for i in range(1,n+1):
    print(i,"! :",re_factorial(i),sep='')

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band