본문 바로가기

# 미사용

재귀

이 블로그의 모든 예제코드는 깃허브에서도 볼 수 있습니다.
    https://github.com/AeroCodeX/

재귀 알고리즘(Iterative)의 개념

하나의 큰 문제를 똑같은 형태를 갖는 여러개의 부분문제로 나누어 푸는 것.
sum(n) // 1부터 n까지의 합.

sum(10) = 10 + sum(9);
sum(9)  = 9 + sum(8);
...
sum(n) = n + sum(n-1);
  • 또 다른 자신이 구했던 이전 값을 활용하여 정답을 계산하며,

  • 비순차적으로 계산이 이루어지는 방식.


여기서 순차적이란 용어는 처음부터 정답까지 모든 경우를 차례대로 계산한다는 의미로 사용되었다.

N=10인 경우의 정답을 구하기 위해 N=0, .. ,9인 경우의 정답까지 전부 구해놓는다는 의미이다.

N=10와 전혀 상관없는 케이스의 정답도 구해놓는다.


비순차적이란 용어는 N=10을 계산하기 위해 필요한 케이스만 계산한다는 의미로 사용되었다.

N=10인 경우의 정답을 구했어도 N=0, .., 9의 경우의 정답이 구해지지 않았을 수 있다.


순회 알고리즘(Iterative)와의 비교

  • 순회는 이전값도 자신이 계산했다.
  • 순회는 순차적으로 계산된다.


순회는 N=10을 계산하는데 N=8이 필요하지 않더라도 구해놓는다.


재귀 알고리즘의 성능

재귀로 구현된 알고리즘은 순회에 비해 쉽고 직관적이지만 

다음의 이슈로 인한 성능저하를 감수해야 한다.

  • 기본적으로 함수호출이므로, 호출 스택을 잡아먹는다.

  • 불필요한 중복계산이 발생할 수 있다.


5번째 피보나치 숫자를 구하기 위해, 

수많은 피보나치 함수가 호출되었고,  특히 1번째 피보나치 숫자는 8번이나 호출되었다.


예제 # N번째 피보나치 수

순회



재귀


예제 # N의 약수의 개수 구하기

순회


재귀




'# 미사용' 카테고리의 다른 글

이분법 (2)  (0) 2018.11.17
이분법 (1)  (0) 2018.11.11
순회  (0) 2018.11.11
무차별 대입  (0) 2018.11.11
[백준 1011] Fly me to the Alpha Centauri 통찰노트  (0) 2018.10.22