์ฌ๊ทํจ์๋?
1. ์ฌ๊ทํจ์ ์ ์
- ์ฌ๊ทํจ์๋ ํจ์๊ฐ ์์ ์ค์ค๋ก๋ฅผ ํธ์ถํ๋ ํจ์๋ฅผ ๋งํ๋ค
- ์ฃผ๋ก ํน์ ๋ฌธ์ ๋ฅผ ์์ ๋จ์๋ก ๋ถํ ํ์ฌ ๋ฐ๋ณต์ ์ผ๋ก ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ๋๋ค
- ์ ์ ํ์ถ์
2. ์ฌ๊ทํจ์์ ๊ตฌ์กฐ
- ๊ธฐ์ ์กฐ๊ฑด(Base Case)
- ์ฌ๊ท ํธ์ถ์ ๋ฉ์ถ๋ ์กฐ๊ฑด
- ์ฌ๊ท ํธ์ถ(Recursive Call)
- ํจ์๊ฐ ์ค์ค๋ก๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ
3. ๊ธฐ๋ณธ ์์
ํฉํ ๋ฆฌ์ผ ๊ณ์ฐ
- $$n! = n × (n-1) × (n-2) × โโโ × 1$$
def factorial(n):
if n == 1: # ๊ธฐ์ ์กฐ๊ฑด
return 1
return n * factorial(n - 1) # ์ฌ๊ท ํธ์ถ
# ์ฌ์ฉ ์์
print(factorial(5)) # ์ถ๋ ฅ: 120 (5 × 4 × 3 × 2 × 1)
4. ์ฌ๊ท ํธ์ถ์ ๊ณผ์
`factorial(5)` ์ ํธ์ถ ํ๋ฆ:
- `factorial(5)` >> 5 * `factorial(4)`
- `factorial(4)` >> 4 * `factorial(3)`
- `factorial(3)` >> 3 * `factorial(2)`
- `factorial(2)` >> 2 * `factorial(1)`
- `factorial(1)` >> `1` (๊ธฐ์ ์กฐ๊ฑด ๋๋ฌ)
๊ฒฐ๊ณผ๋ `5 * 4 * 3 * 2 * 1 = 120` ์ด ๋์ถ๋จ
5. ์ฌ๊ทํจ์์ ์ฅ์ ๊ณผ ๋จ์
์ฅ์
- ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๊ณ , ๋ฐ๋ณต๋ฌธ๋ณด๋ค ์ง๊ด์ ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค
- ํน์ ์๊ณ ๋ฆฌ์ฆ(์: ๋ถํ ์ ๋ณต, ํธ๋ฆฌ ์ํ)์์ ํ์์ ์ด๋ค
๋จ์
- ์๋ชป ์์ฑํ ์ ๋ฌดํ ๋ฃจํ(=์ฌ๊ท)์ ๋น ์ง ์ ์์
- ํจ์ ํธ์ถ ์คํ ์ฌ์ฉ์ผ๋ก ์ธํด ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ด ๋ฎ๋ค
- ๊น์ด๊ฐ ๊น์ด์ง ๊ฒฝ์ฐ ์คํ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ ์ ์์
- ์คํ ์ค๋ฒํ๋ก์ฐ๋?
- ์ ์: ํจ์ ํธ์ถ์ด ๋๋ฌด ๊น์ด์ ธ ํธ์ถ ์คํ(Call stack)์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๊ณผํ ๋ ๋ฐ์ํ๋ ์ค๋ฅ
- ์์ธ: ์ฌ๊ท ํธ์ถ์ ๊ธฐ์ ์กฐ๊ฑด(Base Case)์ด ์๊ฑฐ๋ ๋๋ฌด ๋ง์ ์ฌ๊ท ํธ์ถ๋ก ์ธํด ๋ฐ์ํจ
- ํด๊ฒฐ:
- ๊ธฐ์ ์กฐ๊ฑด์ ๋ช ํํ ์ค์ ํ๋ค
- ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ ํํ๋ค
- `sys.setrecursionlimit()` ์ผ๋ก ์ฌ๊ท ๊น์ด๋ฅผ ์กฐ์ ํ๋ค(๋น๊ถ์ฅ)
- ์คํ ์ค๋ฒํ๋ก์ฐ๋?
6. ๊ธฐํ ์์
1. ํผ๋ณด๋์น ์์ด
def fibonacci(n):
if n <= 1: # ๊ธฐ์ ์กฐ๊ฑด
return n
return fibonacci(n - 1) + fibonacci(n - 2) # ์ฌ๊ท ํธ์ถ
# ์ฌ์ฉ ์์
print(fibonacci(6)) # ์ถ๋ ฅ: 8 (0, 1, 1, 2, 3, 5, 8)
2. ํ์ผ ๋๋ ํ ๋ฆฌ ํ์
import os
def print_files_in_dir(path):
for item in os.listdir(path):
full_path = os.path.join(path, item)
if os.path.isdir(full_path): # ๋๋ ํ ๋ฆฌ๋ผ๋ฉด ์ฌ๊ท ํธ์ถ
print_files_in_dir(full_path)
else: # ํ์ผ์ด๋ผ๋ฉด ์ถ๋ ฅ
print(full_path)
# ์ฌ์ฉ ์์
print_files_in_dir("/path/to/directory")
7. ์ฃผ์ ์ฌํญ
- ๊ธฐ์ ์กฐ๊ฑด(Base Case)๋ฅผ ๋ฐ๋์ ์ค์ ํด์ผํจ
- ๊ธฐ์ ์กฐ๊ฑด์ด ์์ผ๋ฉด ๋ฌดํ ๋ฃจํ๊ฐ ๋ฐ์ํ๋ค
- ์ฌ๊ท ๊น์ด ์ ํ์ ์ฃผ์ํด์ผํจ
- Python ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต๋ ์ฌ๊ท ๊น์ด๊ฐ `1000` ์ผ๋ก ์ค์ ๋ผ์์
- ํ์ ์์ `sys.setrecursionlimit()` ์ผ๋ก ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํจ
8. ๋ฐ๋ณต๋ฌธ์ผ๋ก์ ๋ณํ
- ์: ํฉํ ๋ฆฌ์ผ ๊ณ์ฐ์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ณํ
def factorial_iterative(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
print(factorial_iterative(5)) # ์ถ๋ ฅ: 120
9. ์ฌ๊ทํจ์์ DP(Dynamic Programming)
- ํผ๋ณด๋์น ์์ด ๊ณ์ฐ์์ ์ฌ๊ท๋ ์ค๋ณต ๊ณ์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค
- ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฉ๋ชจ์ด์ ์ด์
(Memoization)์ ์ฌ์ฉํจ
- ๋ฉ๋ชจ์ด์ ์ด์
์ด๋?
- ์ ์: ์ด์ ์ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ์ค๋ณต ๊ณ์ฐ์ ๋ฐฉ์งํ๋ ๊ธฐ๋ฒ์
- ์ฌ์ฉ: ์ฃผ๋ก ์ฌ๊ทํจ์์ ํจ๊ป ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ๋ค
- ๋ฐฉ๋ฒ:
- Python ์์ `dict` `functolls.lru_cache` ๋ฅผ ํ์ฉํจ
- ์์ : ํผ๋ณด๋์น ์์ด์ด ์์
- ๋ฉ๋ชจ์ด์ ์ด์
์ด๋?
- ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฉ๋ชจ์ด์ ์ด์
(Memoization)์ ์ฌ์ฉํจ
def fibonacci_memo(n, memo={}):
if n in memo:
return memo[n]
if n <= 1:
return n
memo[n] = fibonacci_memo(n - 1, memo) + fibonacci_memo(n - 2, memo)
return memo[n]
print(fibonacci_memo(50)) # ๋น ๋ฅด๊ฒ ๊ฒฐ๊ณผ ๋ฐํ
์ ๋ฆฌ ๐งน
- ์ ์ ํ๊ฒ ์ค๊ณํด์ผ ํจ์จ์ฑ์ ๊ทน๋ํํ ์ ์์
- ํธ๋ฆฌ ๊ตฌ์กฐ, ์กฐํฉ ์์ฑ, ํ์ ๋ฌธ์ ์ ์ ํฉํจ
- ๊ธฐ์ ์กฐ๊ฑด๊ณผ ํธ์ถ ๊น์ด๋ฅผ ๋ช ์ฌํ ๊ฒ
- ๋ฐ๋ณต๋ฌธ์ด๋ ๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ์ ์ ์ ํ ํ์ฉํ ๊ฒ
'[SPARTA] AI 9 (24.11 ~ 25.03) ๐๐ปโโ๏ธ > Python ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250109] ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Object-Oriented Programming) ํน์ง (0) | 2025.01.09 |
---|---|
[250106] count() ์ Counter() ์ ์ฐจ์ด์ (0) | 2025.01.06 |
[250103] ๋ฐ์ฝ๋ ์ดํฐ๋? (0) | 2025.01.03 |
[250102] instance method, class method, static method์ ํน์ง๊ณผ ์ฐจ์ด์ (1) | 2025.01.02 |
[241227] sqrt() ์ pow() ๊ฐ๋ ์ ๋ฆฌ (2) | 2024.12.27 |