python μ¬κ· ν¨μλ μκΈ° μμ μ νΈμΆνμ¬ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°μ μ¬μ©λ©λλ€. μ΄λ₯Ό ν΅ν΄ μ½λμ κ°κ²°μ±κ³Ό κ°λ μ±μ λμΌ μ μμ΅λλ€. python μ¬κ· ν¨μλ₯Ό μ¬μ©νμ¬ ν©ν 리μΌ, νΌλ³΄λμΉμμ΄, κ·Έλ¦¬κ³ λ¦¬μ€νΈ νννλ₯Ό ꡬννλ λ°©λ²μ λν΄ μμλ³΄κ² μ΅λλ€.
β£ λͺ©μ°¨
1. μ¬κ·ν¨μπ‘
μ¬κ· ν¨μμμ κΈ°λ³Έ λ¨κ³μ μ¬κ· λ¨κ³λ λ¬Έμ λ₯Ό ν΄κ²°νλλ° μ€μν κ°λ
μ
λλ€.
- κΈ°λ³Έ λ¨κ³(base case) : κΈ°λ³Έ λ¨κ³λ μ¬κ· ν¨μμμ 무ν λ°λ³΅μ λ§κΈ° μν μ€μν μμμ λλ€. ν¨μκ° λ μ΄μ μμ μ νΈμΆνμ§ μκ³ μ’ λ£λλ 쑰건μ λ§ν©λλ€. κΈ°λ³Έ λ¨κ³λ₯Ό ν΅ν΄ μ¬κ· ν¨μκ° λλκ³ κ²°κ³Όλ₯Ό λ°νν μ μμ΅λλ€.
- μ¬κ· λ¨κ³(recursive case) : μ¬κ· λ¨κ³λ μ¬κ· ν¨μμμ μκΈ° μμ μ νΈμΆνμ¬ λ¬Έμ λ₯Ό ν΄κ²°νλ κ³Όμ μ λ§ν©λλ€. μ΄ κ³Όμ μμλ μ£Όμ΄μ§ λ¬Έμ λ₯Ό λ μμ νμ λ¬Έμ λ‘ λλκ³ , μ΄ νμ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ¬κ·μ μΌλ‘ μκΈ° μμ μ νΈμΆν©λλ€. μ΄ κ³Όμ μ κΈ°λ³Έ λ¨κ³μ λλ¬ν λ κΉμ§ λ°λ³΅λ©λλ€.
μ λ κ°μ§ λ¨κ³λ₯Ό ν©ν 리μΌμ ꡬνλ μμ λ₯Ό ν΅ν΄ νμΈν΄ λ³΄κ² μ΅λλ€.
π μ¬κΈ°μ μ κΉ!
ν©ν 리μΌμ΄λ?
μμ μ μ nμ λν΄ n!λ‘ ννλλ©°, nλΆν° 1κΉμ§μ λͺ¨λ μμ μ μλ₯Ό κ³±ν κ°μ λλ€.
κ°λ¨ν λ§ν΄ n!μ 1λΆν° nκΉμ§μ λͺ¨λ μμ μ μλ₯Ό κ³±ν κ°μ λλ€.
μλ₯Ό λ€μ΄, 5μ ν©ν 리μΌμ 5! = 5 x 4 x 3 x 2 x 1 = 120μ λλ€.
# μ¬κ· ν¨μλ₯Ό μ¬μ©νμ¬ ν©ν 리μΌμ κ³μ°νλ ν¨μ
def factorial_recursive(n):
# κΈ°λ³Έ λ¨κ³: nμ΄ 0μΌ λ 1μ λ°ννμ¬ μ¬κ· νΈμΆμ λ©μΆ€
if n == 0:
return 1
# μ¬κ· λ¨κ³: nμ λν ν©ν 리μΌμ n-1μ λν ν©ν 리μΌκ³Ό κ³±νμ¬ λ°ν
else:
return n * factorial_recursive(n - 1)
# ν©ν λ¦¬μΌ κ³μ° μμ
print(factorial_recursive(5)) # μΆλ ₯: 120
2.ν©ν λ¦¬μΌ κ΅¬νκΈ°π²
ν©ν λ¦¬μΌ κ³μ°μμλ λ°λ³΅λ¬Έμ μ¬μ©νλ λ°©λ²κ³Ό μ¬κ· ν¨μλ₯Ό μ¬μ©νλ λ°©λ²μ΄ μμ΅λλ€.
λ κ°μ§ μ κ·Ό λ°©μμ μ°¨μ΄λ₯Ό μ΄ν΄νκΈ° μν΄ μμ λ₯Ό ν΅ν΄ νμΈν΄ λ³΄κ² μ΅λλ€.
# λ°λ³΅λ¬Έμ μ¬μ©νμ¬ ν©ν 리μΌμ κ³μ°νλ ν¨μ
def factorial_iterative(n):
result = 1 # κ²°κ³Όλ₯Ό μ μ₯ν λ³μ μ΄κΈ°ν
for i in range(1, n + 1): # 1λΆν° nκΉμ§ λ°λ³΅
result *= i # κ° μ«μλ₯Ό μ°¨λ‘λ‘ κ³±νμ¬ κ²°κ³Όμ λμ
return result # μ΅μ’
κ²°κ³Ό λ°ν
# μ¬κ·ν¨μλ₯Ό μ¬μ©νμ¬ ν©ν 리μΌμ κ³μ°νλ ν¨μ
def factorial_recursive(n):
# κΈ°λ³Έ λ¨κ³: 0! = 1
if n == 0:
return 1
# μ¬κ· λ¨κ³: n! = n * (n-1)!
else:
return n * factorial_recursive(n - 1)
# ν©ν λ¦¬μΌ κ³μ° μμ
print(factorial_iterative(5)) # μΆλ ₯: 120
print(factorial_recursive(5)) # μΆλ ₯: 120
μ μμ λ₯Ό ν΅ν΄ ν κ°μ§ λ¬Έμ λ₯Ό ν΄κ²°νλ λ€μν μκ³ λ¦¬μ¦μ΄ μ‘΄μ¬νλ€λ κ²μ μ΄ν΄ν μ μμ΅λλ€.
μ¬κ· ν¨μμ λ°λ³΅λ¬Έμ κ°μ λ¬Έμ λ₯Ό ν΄κ²°νμ§λ§, κ°κ°μ λ°©μμ μ€ν μλλ λ©λͺ¨λ¦¬ μ¬μ© λ±μμ μ°¨μ΄κ° μμ μ μμ΅λλ€.
μΌλ°μ μΌλ‘ ν©ν λ¦¬μΌ κ³μ°μμλ λ°λ³΅λ¬Έμ μ¬μ©ν λ°©λ²μ΄ μ¬κ· ν¨μλ₯Ό μ¬μ©ν λ°©λ²λ³΄λ€ ν¨μ¨μ μ λλ€.
μ¬κ· ν¨μλ₯Ό μ¬μ©νλ©΄ ν¨μ νΈμΆ μλ§λ€ μ€νμ νΈμΆ μ λ³΄κ° μ μ₯λλ―λ‘, λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λ λ§μμ§λλ€. λ°λ©΄μ λ°λ³΅λ¬Έμ μ¬μ©νλ©΄ μΆκ°μ μΈ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νμ§ μκ³ λ λμΌν μμ μ μνν μ μμ΅λλ€.
μΌλ°μ μΌλ‘ μ¬κ· ν¨μλ ν¨μ νΈμΆμ λ°λ₯Έ μ€λ²ν€λκ° λ°μνκΈ° λλ¬Έμ λ°λ³΅λ¬Έλ³΄λ€ λ릴 μ μμ΅λλ€. νΉν ν©ν 리μΌκ³Ό κ°μ κ°λ¨ν κ³μ°μμλ μ¬κ· ν¨μκ° λ°λ³΅λ¬Έλ³΄λ€ λ λ§μ μκ°μ΄ μμλ μ μμ΅λλ€.
λ°λΌμ ν¨μ¨μ μΈ μκ³ λ¦¬μ¦μ μ ννλ€λ©΄, ν©ν λ¦¬μΌ κ³μ°μμλ λ°λ³΅λ¬Έμ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
κ·Έλ¬λ μ¬κ· ν¨μλ₯Ό μ¬μ©ν μκ³ λ¦¬μ¦λ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°μλ μ ν©ν μ μμΌλ©°, μκ³ λ¦¬μ¦μ νΉμ±κ³Ό λ¬Έμ μ 볡μ‘μ±μ λ°λΌ λ€λ₯Έ μ νμ΄ νμν μ μμ΅λλ€.;
3.νΌλ³΄λμΉ μμ΄ κ΅¬νπ¨β€οΈπ¨π¨β€οΈπ¨π¨π©π§π¦π©π¦π¦π¨π¦π¦
νΌλ³΄λμΉμμ΄μ 첫 λ²μ§Έ νκ³Ό λ λ²μ§Έ νμ΄ κ°κ° 1μ΄λ©°, κ·Έ λ€μ λͺ¨λ νμ λ°λ‘ μμ λνμ λνμ¬ λ§λ€μ΄μ§λ μμ΄μ λλ€. μλ κ·Έλ¦Όμ ν΅ν΄μ νΌλ³΄λμΉμμ΄μ κ·μΉμ νμΈν΄ λ³΄κ² μ΅λλ€.
κ·Έλ¦Όμμ κ° μ€μ νΌλ³΄λμΉ μμ΄μ κ° νμ λνλ λλ€. κ° νμ λ°λ‘ μμ λνμ λν κ°μ λλ€.
νΌλ³΄λμΉ μμ΄μ μμ°μ€λ½κ² μ¬κ·μ μΈ νΉμ±μ κ°μ§κ³ μμ΅λλ€. κ° νμ μ΄μ λ νμ λν κ°μ΄λ―λ‘, μ΄λ₯Ό μ¬κ·μ μΌλ‘ κ³μ°νλ κ²μ΄ μ§κ΄μ μ λλ€. κ·ΈλΌ μμ λ‘ μ΄ν΄λ³ΌκΉμ?
# νΌλ³΄λμΉ μμ΄μ μ¬κ·ν¨μλ‘ κ³μ°νλ ν¨μ
def fibonacci_recursive(n):
# κΈ°λ³Έ λ¨κ³: 첫 λ²μ§Έμ λ λ²μ§Έ νμ κ°κ° 0κ³Ό 1
if n = 1:
return n
# μ¬κ· λ¨κ³: F(n) = F(n-1) + F(n-2)
else:
return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
# νΌλ³΄λμΉ μμ΄ κ³μ° μμ
for i in range(10):
print(fibonacci_recursive(i), end=" ") # μΆλ ₯: 0 1 1 2 3 5 8 13 21 34
μ¬κ· ν¨μλ₯Ό μ¬μ©νμ¬ νΌλ³΄λμΉμμ΄μ κ³μ°ν λ, λμΌν κ°μ΄ μ¬λ¬ λ² κ³μ°λλ κ²½μ°κ° λ§μ΅λλ€.
μμ μμ μμλ νΌλ³΄λμΉ μμ΄μ κ³μ°νλ κ³Όμ μ μ¬κ· ν¨μλ₯Ό μ¬μ©νμ¬ μκ°ννμμ΅λλ€.
νμ§λ§ μ¬κ· ν¨μλ₯Ό μ¬μ©ν κ²½μ°, μμ΄μ κ°μ΄ κ³μ°λλ κ³Όμ μμ μ€λ³΅ κ³μ°μ΄ λ§μ΄ λ°μνκ³ , ν¨μ νΈμΆμ΄ μ§μμ μΌλ‘ μ¦κ°νμ¬ μμ΄μ μΌλΆλ§μ κ³μ°νλ κ²½μ°μλ κ³μ° μκ°μ΄ λ§€μ° κΈΈμ΄μ§ μ μμ΅λλ€.
λ°λΌμ μμ μμ μμλ νΌλ³΄λμΉ μμ΄μ κ°μ΄ λ무 λ§μμ§λ κ²μ λ°©μ§νκΈ° μν΄ 3λ²μ§Έ μμ΄κΉμ§ λ§μ ꡬν΄λ³΄μμ΅λλ€.
μ΄λ κ² ν¨μΌλ‘μ¨ μμ΄μ΄ μ΄λ»κ² νμ±λλμ§λ₯Ό κ°λ¨νκ² νμΈν μ μμμ΅λλ€.
μ¬κ· ν¨μλ₯Ό μ¬μ©νμ¬ νΌλ³΄λμΉ μμ΄μ κ³μ°ν κ²½μ°, ν¨μ νΈμΆμ΄ μ§μμ μΌλ‘ μ¦κ°ν©λλ€.
F(n)μ κ³μ°ν λ F(n-1)κ³Ό F(n-2)λ₯Ό κ³μ°ν΄μΌ νλ―λ‘, ν¨μ νΈμΆ νμλ 2βΏμ λΉλ‘ν©λλ€.
λ°λΌμ nμ΄ μ»€μ§μλ‘ κ³μ° μκ°μ΄ κΈκ²©νκ² μ¦κ°ν©λλ€.
μ΄λ¬ν μ΄μ λ€λ‘ μΈν΄ νΌλ³΄λμΉ μμ΄μ μ¬κ·μ μΈ λ°©μμΌλ‘ κ³μ°ν λ μκ°μ΄ μ€λ 걸릴 μ μμ΅λλ€.
4. λ©λͺ¨νπ
νΌλ³΄λμΉμμ΄μ κ³μ°ν λλ μ€λ³΅ κ³μ°μ νΌνκΈ° μν΄ λ©λͺ¨μ΄μ μ΄μ κΈ°λ² μ¦, λ©λͺ¨νλ₯Ό μ¬μ©ν©λλ€.
μ΄λ₯Ό ν΅ν΄ λμΌν κ°μ λ°λ³΅μ μΌλ‘ κ³μ°νλ κ²μ λ°©μ§νκ³ , κ³μ° ν¨μ¨μ±μ λμΌ μ μμ΅λλ€.
# λ©λͺ¨νλ₯Ό μ¬μ©νμ¬ μ€λ³΅ κ³μ°μ νΌνλ νΌλ³΄λμΉ μμ΄ ν¨μ
memo = {} # κ²°κ³Όλ₯Ό μ μ₯ν λ©λͺ¨μ΄μ μ΄μ
λμ
λ리
def fibonacci_memo(n):
if n = 1: # κΈ°λ³Έ λ¨κ³: nμ΄ 0 λλ 1μΌ λ
return n
if n not in memo: # λ©λͺ¨μ΄μ μ΄μ
: κ²°κ³Όκ° μμ§ μ μ₯λμ§ μμμ κ²½μ°
# n-1κ³Ό n-2μ νΌλ³΄λμΉ μλ₯Ό μ¬κ·μ μΌλ‘ κ³μ°νμ¬ λν ν, κ²°κ³Όλ₯Ό λ©λͺ¨μ΄μ μ΄μ
memo[n] = fibonacci_memo(n - 1) + fibonacci_memo(n - 2)
return memo[n] # λ©λͺ¨μ΄μ μ΄μ
λ κ²°κ³Ό λ°ν
# νΌλ³΄λμΉ μμ΄ κ³μ° μμ (λ©λͺ¨ν μ¬μ©)
for i in range(10):
print(fibonacci_memo(i), end=" ") # μΆλ ₯: 0 1 1 2 3 5 8 13 21 34
- memo = {}: κ²°κ³Όλ₯Ό μ μ₯ν λμ λ리λ₯Ό μ μΈν©λλ€. μ΄ λμ λ리λ μ΄λ―Έ κ³μ°λ νΌλ³΄λμΉμμ΄μ κ°λ€μ μ μ₯νλ λ° μ¬μ©λ©λλ€.
- def fibonacci_memo(n):: νΌλ³΄λμΉ μμ΄μ κ³μ°νλ ν¨μλ₯Ό μ μν©λλ€. μ΄ ν¨μλ μΈμ nμ λν΄ νΌλ³΄λμΉμμ΄μ κ°μ λ°νν©λλ€.
- if n <= 1:: κΈ°λ³Έ λ¨κ³(base case)λ₯Ό μ²λ¦¬ν©λλ€. λ§μ½ nμ΄ 0 λλ 1μ΄λ©΄, ν΄λΉ κ° κ·Έλλ‘ λ°ννκ³ μ¬κ· νΈμΆμ λ©μΆ₯λλ€.
- if n not in memo:: λ©λͺ¨μ΄μ μ΄μ μ μν 쑰건문μ λλ€. λ§μ½ νμ¬ κ³μ°νλ €λ νΌλ³΄λμΉμμ΄μ κ°μ΄ μ΄λ―Έ λ©λͺ¨μ΄μ μ΄μ λ κ²°κ³Όμ μλ€λ©΄, μ¬κ·μ μΌλ‘ κ³μ°νμ¬ λ©λͺ¨μ΄μ μ΄μ λ κ²°κ³Όλ₯Ό λμ λ리μ μ μ₯ν©λλ€.
- memo[n] = fibonacci_memo(n - 1) + fibonacci_memo(n - 2): νμ¬ κ³μ°νλ €λ νΌλ³΄λμΉμμ΄μ κ°μ μ¬κ·μ μΌλ‘ κ³μ°ν©λλ€. μ΄λ, μ΄λ―Έ λ©λͺ¨μ΄μ μ΄μ λ κ°μ΄ μλ€λ©΄ ν΄λΉ κ°μ μ¬μ©νμ¬ μ€λ³΅ κ³μ°μ νΌν©λλ€.
- return memo[n]: λ©λͺ¨μ΄μ μ΄μ λ κ²°κ³Όλ₯Ό λ°νν©λλ€.
- for i in range(10):: νΌλ³΄λμΉ μμ΄μ μ²μ 10κ° κ°μ κ³μ°νκΈ° μν λ°λ³΅λ¬Έμ μ€μ ν©λλ€.
- print(fibonacci_memo(i), end=" "): κ° μΈλ±μ€μ λν΄ κ³μ°λ νΌλ³΄λμΉμμ΄μ κ°μ μΆλ ₯ν©λλ€.
5. 리μ€νΈ νννπ
리μ€νΈ νννλ μ€μ²©λ 리μ€νΈλ₯Ό νλμ ννν(1μ°¨μ) 리μ€νΈλ‘ λ§λλ μμ μ λ§ν©λλ€.
μλ₯Ό λ€μ΄, [1, 2, [3, 4], [5, [6, 7]]]μ κ°μ μ€μ²©λ 리μ€νΈκ° μμ λ, μ΄λ₯Ό [1, 2, 3, 4, 5, 6, 7]κ³Ό κ°μ΄ ννν 리μ€νΈλ‘ λ§λλ κ²μ λλ€.
리μ€νΈ νννλ μ¬κ·μ μΈ λ¬Έμ μ λλ€. 리μ€νΈ μμ λ λ€λ₯Έ 리μ€νΈκ° ν¬ν¨λ μ μκ³ , μ΄λ¬ν μ€μ²©λ 리μ€νΈλ₯Ό ννννμ¬ νλμ λ¨μΌν 리μ€νΈλ‘ λ§λλ μμ μ μ¬κ·μ μΈ μ κ·Όμ΄ μ ν©ν©λλ€.
def flatten_list(lst):
"""
μ€μ²©λ 리μ€νΈλ₯Ό ννννλ ν¨μ
Parameters:
lst (list): νννν 리μ€νΈ
Returns:
list: νννλ 리μ€νΈ
"""
flattened = [] # νννλ 리μ€νΈλ₯Ό μ μ₯ν λ³μ μ΄κΈ°ν
for item in lst: # 리μ€νΈμ κ° μμμ λν΄ λ°λ³΅
if isinstance(item, list): # μμκ° λ¦¬μ€νΈμΈμ§ νμΈ
flattened.extend(flatten_list(item)) # 리μ€νΈλ©΄ μ¬κ·μ μΌλ‘ ννννμ¬ μΆκ°
else:
flattened.append(item) # 리μ€νΈκ° μλλ©΄ κ·Έλλ‘ μΆκ°
return flattened # νννλ 리μ€νΈ λ°ν
example_list = [1, 2, [3, 4, [5, 6]], 7, [8, [9, 10]]] # νννν μμ 리μ€νΈ
print(flatten_list(example_list)) # μΆλ ₯: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- flatten_list ν¨μλ μ€μ²©λ 리μ€νΈλ₯Ό λ°μμ νννλ 리μ€νΈλ₯Ό λ°νν©λλ€.
- ν¨μλ λ°λ³΅λ¬Έμ μ¬μ©νμ¬ λ¦¬μ€νΈμ κ° μμλ₯Ό νμΈν©λλ€.
- μμκ° λ¦¬μ€νΈμΈ κ²½μ°μλ μ¬κ·μ μΌλ‘ flatten_list ν¨μλ₯Ό νΈμΆνμ¬ νννν κ²°κ³Όλ₯Ό μΆκ°ν©λλ€.
- μμκ° λ¦¬μ€νΈκ° μλ κ²½μ°μλ κ·Έλλ‘ κ²°κ³Ό 리μ€νΈμ μΆκ°ν©λλ€.
- μ΅μ’ μ μΌλ‘ νννλ 리μ€νΈλ₯Ό λ°νν©λλ€.
μ΄ ν¨μλ μ¬κ·μ μΈ λ°©μμΌλ‘ μ€μ²©λ 리μ€νΈλ₯Ό λͺ¨λ νΌμ³μ νλμ λ¨μΌν 리μ€νΈλ‘ λ§λλλ€.
6. ν΅μ¬ λ΄μ©π