코드로보시죠
[코드잇] 파이썬 재귀함수 마스터하기(feat. 코드잇 연속출석 뱃지) 본문
학교에서 알고리즘 과목을 듣게 되면서 재귀호출을 쓸 일이 생겼다.
그런데.. 너무 오래 사용하지 않다 보니 어렴풋이 기억만 나고, 살짝 기억이 희미해진 느낌이 들었다.
그래서 코드잇에 재귀호출이 있을까.. 하며 검색해봤는데!
진짜 있었다 ㅋㅋㅋㅋ
(여긴 없는게 없어서 참 좋단 말이지..)
강의가 딱 4개였고 길이도 다 합해야 20분? 정도였어서
학교 강의 보충용으로 부담이 적었다.
생각보다 강의 구성이 굉장히 알차고 체계적이었음.
암튼 오늘은 재귀호출 배운거 정리해보려 함.
난 개인적으로 이 장면이 참 좋았다.
유튜브, 책 등등 예전부터 재귀함수를 배웠다만, 코드잇 설명이 꽤나 초보자에게 맞춰진 느낌이라 이해하기 좋았다.
저 장면이 무엇을 의미하는지, 재귀함수는 뭐고 어떻게 구현하는지 차근차근 정리해보겠다.
재귀함수가 뭐냐?
영어시간에 배운 재귀대명사를 생각해보자.
myself, himself, herself... 뭔가 자기 스스로 한 것을 의미한다.
프로그래밍 언어에서의 재귀도 똑같다. 무언가 자기 스스로와 관련이 있다는 것인데...
프로그래밍에서 재귀함수란, 자기 자신을 호출하는 함수를 의미한다.
즉, return부에 하나의 값만 주고 끝나는 일반적인 함수와 달리,
return부에서 다시 자기 자신을 호출한다는 것이다.
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
자, else 블록을 보자.
return 뒤에 factorial이라는 자기 자신 함수명을 다시 호출하고 있는데,
파라미터에 전달하는 값이 이번엔 하나 줄어든 n-1이다.
이를 더 잘 이해하려면, 베이스케이스와 하위문제를 알아야 한다.
아까 위에서 내가 강의중에 가장 좋은 장면이라고 첨부한 사진이 바로 이와 관련되어있다.
자, 5의 팩토리얼을 재귀함수를 이용해 구현해본다고 생각해보자.
5팩토리얼은 4! 에 5를 곱한 것으로 생각할 수 있다.
우리는 지금 반복문을 사용하지 않고 구현해야 하는 상황임을 명심하자.
그럼, 4!역시 바로 구하는 것은 불가능하다.
4!은 3! 에 4를 곱한 것과 같다.
3!역시 바로 구하는 것이 어려우니, 2!에 3을 곱한 것으로 생각할 수 있다.
같은 원리로, 2!역시 2에 1!을 곱한 것으로 생각할 수 있다.
1!까지 내려와보니, 1!은 그냥1이라, 바로 값을 구할 수 있다.
그럼, 1!의 값을 2!에 전달하면, 2! = 1! x 2 라는 식의 1!자리에 값을 주면서 2!이 구해진다.
그럼, 3! = 2! x 3이라는 식의 2!에 값이 들어가면서 3!도 알 수 있게 된다.
같은 원리로 계속 리턴값을 호출부에 반환해주면 최종 값이 구해진다는 원리.
말로 쓰면 어려울 것 같아 준비했다.
아래의 그림을 보라
fibo(5)를 호출하는 순간 1이라는 값이 바로 구해지는 fibo(1)이 호출되는 순간까지
함수 안에서 자기 자신을 계속 호출하고,
fibo(1)의 값은 fibo(2)로 전달된다.
왜냐? fibo(1)을 호출한 함수가 fibo(2)니까!!!
(return(n-1)에서 n=2여야 fibo(1)을 호출한 것이 아니겠는가.)
아무튼 이런 것이 재귀호출이다.
재귀호출에서, 값을 바로 줄 수 있는 n==1인 경우 같은 케이스를 베이스케이스라 하고,
else부에 해당하는 것 처럼 하위 문제로 쪼개 나가야 하는 경우를 재귀케이스라 한다.
하위문제는 아까 5!을 구하기 위해 4!을 구하고, 4!을 구하기 위해 3!을 구했던 것 처럼,
상위 문제를 해결하기 위해 구하는 더 작은 문제라 생각하면 된다.
이걸 코드잇에서는 하나 하나 뜯어 코드의 n값이 어떻게 변화하고,
각 상황별로 어떤 일이 일어나는지 눈으로 확인시켜줬다. 그래서 이해를 더 완벽히 했다.
팩토리얼 예제 말고도 다양한 예제로, 코드가 어떻게 변화하는지 눈으로 직접 보여줘서 책으로 공부하던 시절보다 직관적으로 이해하기 매우 쉬웠다. 땡큐 코드잇 ㅋ
그리고, 꾸준히 코드잇으로 공부했더니 3일 연속 출석중이라며 알림을 보내주더라!
꾸준히 공부하는 나의 모습을 응원하고 기록해주기까지 하니 공부할 맛이 났다.
친구들하고 경쟁하는 것도 좋을듯 ㅋㅋㅋㅋ
또, 강의 들을 때마다 포인트를 주는데, 그 포인트가 쌓여서 본인의 레벨을 올려준다.
레벨 키우는 재미가 장난 아니다.
아무튼, 코드잇 강의들은 초보자의 눈높이에 맞춰져 누구나 쉽게 이해할 수 있다는 것이 큰 장점인듯 하다.
전공자인 나도, 학교 수업을 듣다가 부족한 부분은 항상 코드잇으로 보충한다. 학점은 늘 좋다.
고맙다 코드잇 ㅋㅋ.
이상, 재귀함수를 마스터한 코드잇 앰배서더 1기 이진우였습니다!