백준 10872번 풀이

문제

팩토리얼인데 이제 재귀함수를 곁들인… 그거 맞다.

참고로 수학파트에 하나 남았는데 그거는 푸는 데 시간이 좀 오래 걸릴 것 같아서 일단 보류. 점심시간에 10~20분 남짓한 시간에 풀만한 문제가 아니었다 그건… 문제 읽다가 뇌에서 블루스크린 뜸…

풀이

재귀함수?

그… 이게 대충… 내가 라이츄 꺼내면 재귀함수임. 뭔소리여 그건

재귀함수는 정의단계에서 자신을 재참조하는 함수인데, 이따 풀이를 보면 알겠지만 함수 안에서 개 뜬금없이 함수가 또 호출되는 시추에이션이 벌어진다. 아 그래서 라이츄라고… 그럼 상대가 꺼내면 뭔데요 나 자신과의 싸움 참고로 모든 반복문과 변수로 짜여지는 알고리즘은 재귀함수로 표현이 가능하지만, 재귀함수를 쓰게 되면 흐름을 파악하기가 어렵다는 단점이 있다. 쌉고수들은 알지 않을까

코드! 코드를 보자!

def factorial(n):
  if n == 1:
    return 1
  return n * factorial(n-1)

이게 예전에 재귀함수 공부하면서 짰던 팩토리얼 코드인데 저거 쌩으로 내면 틀려요…

저게 재귀함수의 형태이다. n이 1이면 1을 내놓고, 아니면 n에 n-1 함수 때려박은 걸 곱하라는 게 팩토리얼(n)에 대한 정의. 그럼 지금부터 저걸 쌩으로 내면 틀리는 이유를 알아보자.

첫째. 0!에 대한 정의가 안 되어 있다. (예시를 보면 10!과 0!이 있는데 저 코드는 1에서 끝나서 0 쓰면 depth 에러뜬다)

둘째. 입력과 출력이 없다. 함수만 딸랑 있고 저기에 넣을 숫자나 출력값에 대한 코드가 없다. return은 함수 돌리고 반환하라는거지 저거 자체로 화면에 출력하는 구문은 아니라서, 화면에 출력하려면 print문을 써야 한다.

import sys
def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n-1)
N = int(sys.stdin.readline())
print(factorial(N))

그래서 입출력에 대한 구문이 들어가야 한다. 입력은 뭐 함수 위에 있든 밑에 있든 자유인데 본인 코딩 스타일이 모듈-함수(클래스)-입력-코드-출력 순서라…