1. 재귀 호출
재귀 호출은 함수가 자기 자신을 다시 호출하는 것을 뜻한다.
즉 어떤 함수 안에서 자기 자신을 부르는 것을 말한다.
def hello(): print("hello") hello() # hello()함수 안에서 다시 hello()를 호출 hello() # hello()함수를 호출
hello함수를 보면 "hello"라는 문장을 출력한 다음 자기 자신인 hello()를 다시 호출하는데
이것이 바로 재귀 호출이다.
"hello"를 출력한 후 다시 자기 자신을 호출하고 또 다시 "hello"를 출력하고 다시 자기 자신을
호출해서 "hello"를 출력하는 과정을 영원히 반복하게 된다. ( 종료 조건이 없기 때문에 )
그러다가 결국 함수 호출에 필요한 메모리를 다 써 버리고 나면 에러를 내고 정지해버린다.
그러므로 재귀 호출 프로그램이 정상적으로 작동하려면 반드시 종료 조건이 필요하다.
실행 결과


종료조건이 없어서 계속 재귀 호출을 반복하다가 메모리를 다 써 버리고 재귀에러가 난다.
2. 팩토리얼을 구하는 알고리즘1 (재귀 호출 미사용)
# 팩토리얼을 구하는 알고리즘1 (재귀 호출 미사용) #입력: n #출력: 1부터 n까지 연속한 숫자를 곱한 값 def fact(n): f = 1 # 곱을 계산할 변수 초기값은 1 for i in range(1, n + 1): # 1부터 n까지 반복(n + 1은 제외) f = f * i return f print(fact(5)) print(fact(10))
실행 결과

3. 팩토리얼을 구하는 알고리즘2 (재귀 호출 사용)
# 팩토리얼 구하는 알고리즘2 (재귀 호출 사용) # 입력: n # 출력: 1부터 n까지 연속한 숫자를 곱한 값 def fact2(n): if n <= 1: # 1이하가 되면 종료(0포함) return 1 return n * fact2(n - 1) # n!을 구하기 위해서 1 작은 값인 (n - 1)이 재귀호출 됨 print(fact2(5)) print(fact2(10))
n이 1보다 크면 n x (n-1)을 결과값으로 돌려주고 이 과정에서 n!을 구하기 위해서 1작은 값인 fact(n - 1)이
재귀 호출된다.
그리고 나서 다시 종료 조건에 해당하는지 확인하고 종료 조건이 아니라면 이번에는 바로 직전 값에서 하나
더 작아진 값으로 호출하고 이렇게 계속 반복하다보면 결국 fact(1)이 되고 종료가 되어
원하는 답을 얻게 된다.
예) fact(5) 호출
1. fact(5)는 5 * fact(4)이므로 fact(4)를 호출하고
2. fact(4)는 4 * fact(3)이므로 fact(3)를 호출하고
3. fact(3)는 3 * fact(2)이므로 fact(2)를 호출하고
4. fact(2)는 2 * fact(1)이므로 fact(1)를 호출하고
5. fact(1)은 종료 조건이므로 더이상 fact() 함수를 호출하지 않고 1을 돌려준다.
5!
= 5 x 4!
= 5 x 4 x 3!
= 5 x 4 x 3 x 2!
= 5 x 4 x 3 x 2 x 1!
= 5 x 4 x 3 x 2 x 1
= 120
실행 결과

'개발 공부한 내용 정리 > Algorithm' 카테고리의 다른 글
Algorithm- 하노이의 탑 알고리즘 (0) | 2020.08.12 |
---|---|
Algorithm- 최대공약수 구하기 (0) | 2020.08.11 |
algorithm - 동명이인 찾기 (0) | 2020.08.08 |
알고리즘- 최대값 찾기 (0) | 2020.08.07 |
알고리즘- 1부터 n번째까지 연속한 수의 제곱의 합을 구하기 (0) | 2020.08.06 |