무언가를 제로 베이스에서부터 공부할 때 가장 난감한건 기본적인 개념도 모르기에 도무지 진도가 나가지 않는 것이다.

가령 영어로 소설책을 읽으려 하는데 모든 문장에 모르는 단어들이 수두루 빽빽 등장해 계속 사전을 뒤적여야 하는 모양과 같다. 속된 말로 '빡치는' 상황이다. 요즘 매일 빡치고 있다. 그래도 좌절하지 말고 찾아볼 수밖에. 

각설하고, 그리하여 '재귀'를 찾아봤다. 영어로는 recursion이다. 

칸 아카데미에서 재귀 알고리즘을 설명하기 위해 재귀 개념을 설명한 게 있다. 

재귀란 '어떤 문제를 해결하기 위해 알고리즘을 설계할 때 동일한 문제를 조금 더 작은 경우를 해결함으로써 해결하는 것'이라고 한다.

이해가 잘 안돼 위키백과를 봤다. 

컴퓨터 과학에서의 재귀는 자신을 정의할 때 자기 자신을 재참조하는 방법을 뜻하며, 이를 프로그래밍에 적용한 것을 재귀 호출(recursive call)이라고 한다. 




한 마디로 행아웃에서 내 스크린 공유하기를 눌렀을 때 나오는 위 화면같은 게 재귀다. 이 이미지를 기억해둬야겠다.


프로그래밍에서의 재귀 

코딩의 신 아샬 님의 수업 자료에서 재귀에 대한 부분을 찾아, 정리해둔다. 

재귀는 함수 f에서 함수 f를 호출하는 것이다. 

가령 재귀를 이용해 계승(factorial)을 구할 수 있다. 
먼저 계승을 수학적으로 표현하면, 


1! = 1
2! = 2 * 1
3! = 3 * 2 * 1
4! = 4 * 3 * 2 * 1


f(n) = n!

f(n) = n * (n - 1) * (n - 2) *  … * 1

>>>

f(n) = 1 (n = 1인 경우)
f(n) = n * f(n-1)

이를 파이썬 코드로 옮기면 다음과 같다.


1
2
3
4
5
6
def fatorial(n):
    # 종료 조건
    if n == 1:
        return 1
    # 재귀
    return n * factorial(n - 1)

재귀 함수의 또 다른 예 : 


1
2
3
4
5
6
7
8
def recursive(data):
    if data < 0:
        print ('ended')
    else:
        print (data)
        recursive(data - 1)
        print ('returned', data)
recursive(4)

코드 출처 : 잔재미 코딩