λμΆ©μ μκ³ μμμ§λ§,, μ§κΈκΉμ§λ μκ³ λ¦¬μ¦μ λν μ νν κ°λ
μμ΄ λ¬Έμ λ₯Ό ν΄κ²°ν΄μλ€.
νμ§λ§ μ μ°¨ λ¬Έμ μμ€μ΄ λμμ§λ©΄μ μκ³ λ¦¬μ¦μ μ νν νμ
νκ³ μμ΄ν νλ€λ κ²μ λλ,,
λ°λΌμ μ€λλΆν°! λΉκ΅μ μ½κ³ νμμ μΈ μκ³ λ¦¬μ¦λΆν° 곡λΆν λ΄μ©μ μ 리νλ €κ³ νλ€.
νμ΄ν
><
π μ¬κ· ν¨μ(Recursive Call)
μ¬κ· ν¨μλ λ§ κ·Έλλ‘,
ν¨μμμ κ·Έ ν¨μλ₯Ό λΆλ₯΄κ³ , λ λΆλ₯΄κ³ ...!λ₯Ό λ°λ³΅νλ κ²μ΄λ€.
μ¬κ· ν¨μμ λνμ μΈ μλ λ°λ‘ ν©ν 리μΌμ΄λ€.
ν©ν λ¦¬μΌ ν¨μλ₯Ό ꡬνν΄λ΄μΌλ‘μ¨ μ¬κ· ν¨μλ₯Ό μ΄ν΄ν΄λ³΄μ.
π ν©ν λ¦¬μΌ ν¨μ ꡬν
ν©ν λ¦¬μΌ κ³μ°μ μ§ν λ°©μμ κ°λ¨ν μμ±νλ€.
μμ κ°μ΄ ν©ν 리μΌμ (μꡬν μ«μ) * (κ·Έ μ μ«μμ ν©ν λ¦¬μΌ κ°) μ μμΌλ‘ ꡬμ±λκ³ ,
μ΄λ₯Ό κ°λ¨ν νννλ©΄ (num) * (num -1)! μ΄ λκ² λ€.
μ¬κΈ°μ μ μ μλ μ μ
3!μ ꡬνλ €λ©΄ 2!μ ꡬν΄μΌ νκ³ , 2!μ ꡬνλ €λ©΄ 1!λ₯Ό ꡬν΄μΌ νλ λ°©μμΌλ‘,
꼬리μ 꼬리λ₯Ό 무λ νμ΄ λ°©μμ΄ νμνλ€λ κ²μ΄λ€.
π ν©ν 리μΌμ ν¬ν¨νμ¬, μ΄λ° λ°©μμ νμ΄κ° νμν λ! λ°λ‘ μ¬κ·ν¨μλ₯Ό μ μ©νκ² μ¬μ©ν μ μλ€.
μμ λ΄μ©μ μ½λλ‘ νμΈν΄λ³΄μ.
func Factorial(_ num: Int) -> Int {
if num < 2 { return num }
return Factorial(num-1) * num
}
print(Factorial(3)) // 6
print(Factorial(5)) // 120
λ¨Όμ Factorial ν¨μμ return λ¬Έμ 보면, μμμ ꡬν num * (num - 1)! μ ννν κ²μ νμΈ κ°λ₯νλ€.
μ
λ ₯ν num κ°μ λν΄ num - 1μ ν΄λΉνλ Factorial ν¨μλ₯Ό νΈμΆνκ³ , num κ°μ κ³±ν΄ λ¦¬ν΄νλ€.
μ 체μ μΈ λ‘μ§μ μ΄ν΄λ³΄λ©΄, if λ¬Έμ μμ±ν μμΈμ²λ¦¬μ λλ¬ν λκΉμ§ ν¨μ νΈμΆμ λ°λ³΅νλ€κ°
numμ΄ 2λ³΄λ€ μμμ§λ©΄ return num ꡬ문μ μμμΌλ‘, μμλμ κ³μ°μ μ§ννκ² λλ λ°©μμ΄λ€.
λͺ μ€ λμ§ μλ κ°λ¨ν ν¨μμ§λ§,
λ§μ ꡬννλ €κ³ νλ©΄ 볡μ‘νκ² λκ»΄μ§λκ² λ°λ‘ μ΄ μ¬κ·ν¨μμΈλ― νλ€.γ
λ§λ‘ μ μ μ€λͺ
μ΄ μ‘°κΈ μ΄λ €μ°λ,, λνλ‘ Factorial(3)μ μ²λ¦¬ κ³Όμ μ κ·Έλ¦ΌμΌλ‘ νμΈν΄λ³΄μ.
λ©λͺ¨λ¦¬μ ν¨μκ° μ μ₯λλ κ³Όμ μ μμλλ‘ νννλ€.
μ°μ 3μ μ
λ ₯νκΈ°μ Factorial(2)λ₯Ό νΈμΆνκ³ , Factorial(2)λ λ Factorial(1)μ νΈμΆνλ€.
μ΄ λ 1μ 2λ³΄λ€ μμΌλ―λ‘ ifλ¬Έμ΄ μ€νλμ΄ 1μ λ°ννκ² λκ³ , 본격μ μΈ ν©ν λ¦¬μΌ κ³μ°μ΄ μμλλ€.
μ΄λ κ² LIFO μμλλ‘ (stack ꡬ쑰μ΄κΈ° λλ¬Έ)
λ§μ§λ§ return κ°μΌλ‘ μ΄μ μ νΈμΆλ ν¨μμ κ³μ° κ²°κ³Όλ₯Ό λ°ννκ³ ,
λ κ·Έ κ²°κ³Ό κ°μΌλ‘ κ·Έ μ΄μ νΈμΆλ ν¨μμ κ³μ° κ²°κ³Όλ₯Ό λ°ννλ λ°©μμΌλ‘ μ§νλλ κ²μ΄λ€.
λ°λΌμ μ΅μ’
return κ°μΌλ‘ 6μ΄ λ°νλ¨μ νμΈν μ μλ€.
π μ¬κ· ν¨μμ κΈ°λ³Έ νν
μμμ ν©ν λ¦¬μΌ ν¨μλ₯Ό ꡬνν΄λ³΄λ©° μ¬κ·ν¨μμ κΌ νμν νμ μμλ€μ΄ μμμ μ μ μμλ€.
μ¬κ·ν¨μμ νμ μμλ€μ 체ν¬ν΄λ³΄κ³ , κΈ°λ³Έ ννλ₯Ό μ 리ν΄λ³΄μ.
π μ¬κ·ν¨μμ νμ μμ
- ν¨μ νμΆ μ‘°κ±΄
- ν¨μ νΈμΆ
- λ¦¬ν΄ κ°
무ν λ°λ³΅μ λΉ μ§μ§ μλλ‘ νκΈ° μν΄ νμΆ μ‘°κ±΄μ μ νν λͺ
μν΄μ£Όκ³ ,
μ¬κ· ν¨μμ ν΅μ¬μΈ ν¨μ μ€μ€λ‘λ₯Ό νΈμΆνλ ꡬ문μ μ μμ±ν΄μ€λ€λ©΄ μ¬κ·ν¨μμ κΈ°λ³Έ ννλ μμ±λλ€.
func recursiveCall(_ num: Int) -> /*λ°ν νμ
*/ {
if /*νμΆ μ‘°κ±΄*/ { return /*λ°λ³΅λλ ν¨μ νΈμΆμ μ’
λ£μ΄μ, 첫 λ²μ§Έ λ°ν κ°*/ }
return return recursiveCall(/*μλ‘μ΄ μ
λ ₯ κ°*/)
}
μμμ μμ±ν νμ 쑰건μ κΈ°λ°μΌλ‘ μ¬κ· ν¨μμ κΈ°λ³Έ ννλ₯Ό μμ±νλ€.
λ€μν μ¬κ· ν¨μλ€μ΄ μ‘΄μ¬νκ² μ§λ§, κ°μ₯ κΈ°λ³Έμ μΈ μΌμ΄μ€λ₯Ό νννλ€.
π μ 리
ν©ν λ¦¬μΌ ν¨μμ ꡬνμ ν΅ν΄ μ¬κ· ν¨μλ₯Ό μ΄ν΄νκ³ , μ¬μ© λ°©λ²μ 곡λΆνλ€.
μ¬κ· ν¨μλ νλ§λλ‘ 'LIFO λ°λ³΅ ν¨μ'λΌκ³ νννκ³ μΆλ€.
κ°λ
μ μ΄λ ΅μ§ μμ§λ§, λ§μ ꡬννλ €κ³ νλ©΄ 머리 μμμ λ²νΌλ§μ΄ κ±Έλ¦°λ€,,
μ νν μ΅νμΌλ, 무쑰건 μ°μ΅μ λ§μ΄ ν΄λ³΄λ κ²μ΄ μ€μν κ² κ°λ€.
π₯ μΆκ°!!
μ¬κ· ν¨μλ μ₯μ λ λͺ ννμ§λ§, λ¨μ λν λͺ νν μ‘΄μ¬νλ€.
λ°λΌμ μ΄ λ¨μ μ 극볡νκΈ° μν '꼬리 μ¬κ· ν¨μ'μ λν κΈμ λ€μμ λ€λ€λ³΄λ €κ³ νλ€.
'5οΈβ£ CS > Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java Algorithm Note] μμ΄ (feat. μ¬κ·) (0) | 2022.08.15 |
---|---|
[Swift Algorithm Note] μ΅μ₯ μ¦κ° λΆλΆ μμ΄ 2 (feat. BS) (0) | 2021.08.29 |
[Swift Algorithm Note] μ΅μ₯ μ¦κ° λΆλΆ μμ΄ (feat. DP) (0) | 2021.08.28 |
[Swift Algorithm Note] λμ κ³νλ² (feat. Fibonacci) (0) | 2021.08.28 |
[Swift Algorithm Note] 꼬리 μ¬κ· ν¨μ (feat. Fibonacci) (0) | 2021.07.09 |
λκΈ