top00an   2년 전

안녕하세요. 제가 재귀함수를 공부하고 있는데 진짜 이해가 너무 안되서 ㅠㅠ  재귀함수가 어떤 과정으로 실행되면서 작동하는지 도저히 이해가 안되서 질문드립니다. ㅠㅠ

add_fact()의 값이 5가 들어가면 

return 5 * (5 - 1 ) + 5 이런 방식으로 되는건가요?...

수학적으로 이해가 안되서 처음접하는거라... 계산 과정좀 설명 부탁드리겠습니다ㅠ

bamgoesn   2년 전

우선 add_fact(5)는 return add_fact(4)+5가 됩니다.

재귀함수 역시 마찬가지로 함수라서, 뭐 엄청 특별한 게 있는 건 아닙니다.

def add(a, b):
    return a+b

def triple(a, b, c):
    return add(a, b) * c

위와 같은 함수가 있을 때 triple(1, 2, 3)을 호출하면 무슨 값이 반환될까요? 어렵게 생각할 것 없이, return에 적힌 a, b, c에 각 변수의 값을 그대로 대입한 값이 반환될 겁니다. 즉, add(1, 2)*3을 반환하려고 할 겁니다. 이때 add(1, 2) * 3을 반환하려면 자연스럽게 add(1, 2)의 값을 알아야 할 것이므로, add(1, 2)를 호출해 add(1, 2)의 값을 알아내게 될 겁니다.

재귀함수 역시 마찬가지입니다. 예를 들어 add_fact(5)를 호출한다면 이 함수는 return에 적힌 n에 n의 값을 그대로 대입한 값을 반환할 겁니다. 즉, add_fact(5-1) + 5, 즉 add_fact(4) + 5를 반환하려고 할 겁니다.

이때 이 함수는 이 값을 알아내기 위해, 자연스럽게 add_fact(4)를 호출하게 됩니다. 제가 제시한 예시와 사실 다를 게 없습니다. 그렇게 해서 add_fact(4)가 최종적으로 값을 반환하게 되면, add_fact(5)는 이 값에 5를 더한 값을 반환할 겁니다.

재귀함수는 근본적으로 함수 안에서 함수를 호출하는 것과 다를 게 없습니다. 그저 그 함수가 자기 자신일 뿐입니다. (그래도 처음엔 이해가 어렵고, 막상 활용하려고 해도 잘 안 보이는 게 사실이긴 합니다)

-----------------------------------

이해를 돕기 위해 add_fact(5)의 계산 과정을 끝까지 풀어보면 다음과 같습니다.

add_fact(5): n!=0이므로 add_fact(4) + 5를 반환하려고 함. add_fact(4)의 값을 알기 위해 이 함수를 호출함.

---- add_fact(4): n!=0이므로 add_fact(3) + 4를 반환하려고 함. add_fact(3)의 값을 알기 위해 이 함수를 호출함.

-------- add_fact(3): n!=0이므로 add_fact(2) + 3을 반환하려고 함. add_fact(2)의 값을 알기 위해 이 함수를 호출함.

------------ add_fact(2): n!=0이므로 add_fact(1) + 2를 반환하려고 함. add_fact(1)의 값을 알기 위해 이 함수를 호출함.

---------------- add_fact(1): n!=0이므로 add_fact(0) + 1을 반환하려고 함. add_fact(0)의 값을 알기 위해 이 함수를 호출함.

-------------------- add_fact(0): n==0이므로 0을 반환함.

---------------- add_fact(1): add_fact(0)이 0임을 알았으므로 0+1 = 1을 반환함.

------------ add_fact(2): add_fact(1)이 1임을 알았으므로 1+2 = 3을 반환함.

-------- add_fact(3): add_fact(2)가 3임을 알았으므로 3+3 = 6을 반환함.

---- add_fact(4): add_fact(3)이 6임을 알았으므로 6+4 = 10을 반환함.

add_fact(5): add_fact(4)가 10임을 알았으므로 10+5 = 15를 반환함.

결국 뜯어보시면 그저 함수 실행 중에 맞닥뜨리는 함수가 있을 때 그 함수를 다시 호출하는 것뿐입니다. 그저 그 함수가 이미 실행중인 함수일 때 그걸 재귀함수라고 부를 뿐입니다.

단계별로 풀어보기 -> 재귀 파트를 풀어보면서 감을 잡아보셔도 좋을 것 같습니다. 어렵더라도 그 파트를 한 번 다 돌고 나면 재귀에 대한 눈이 확실히 뜨일 겁니다.

top00an   2년 전

진짜 정말로 감사드립니다 책에서 보던거 보다 한번에 이해가 되었습니다.. 감사합니다 ㅜㅜ!!

댓글을 작성하려면 로그인해야 합니다.