이번에 볼 예제는 가장 유명한 것들 중의 하나인 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
가 발생하는 것을 확인할 수 있죠?