이번에 볼 예제는 가장 유명한 것들 중의 하나인 factorial 함수를 구현하는 것입니다. 크게 이런 류의 함수를 구현할 때는 두 가지 방법으로 나뉘는데요, Recursive 방법과 Iterative 방법으로 나뉠 수 있습니다.

먼저 Recursive한 방법으로 구현해 보겠습니다.

def factorial_recur(n):
    if n == 2 or n == 1:
        return n
    else:
        return n * factorial_recur(n-1)

n이 정상적인 입력으로 들어왔다고 가정하고 하겠습니다~~(중요한건 이게 아니니까요 ㅋㅋ) 자기 자신을 함수 내에서 호출한다고 해서 recursive function이라는 이름이 붙었습니다.

print factorial_recur(5)
120

결과가 잘 출력됨을 확인할 수 있습니다. 이제 Iterative 방법으로 구현해 보겠습니다.

def factorial_iter(n):
    if n == 1 or n == 2:
        return n
    else:
        result = 1
        while n > 1:
            result *= n
            n -= 1
        return result

print factorial_iter(5)
120

마찬가지로 결과가 잘 출력됨을 확인할 수 있습니다.

두 가지 모두 좋은 결과값을 출력하지만, 결국에 선호되는 방법은 iterative한 방법입니다. 그 이유는 n이 많이 커질수록 recursive는 해결되지 못하고 stack에 쌓이는 함수가 많아지기 때문에 결국 stack overflow가 발생하게 되기 때문이죠. 간단하게 보여드리면,

print factorial_recur(100000) % 100

RuntimeError: maximum recursion depth exceeded

print factorial_iter(100000) % 100
0

Recursive 방법으로 했을 때는 RuntimeError가 발생하는 것을 확인할 수 있죠?