[Swift Algorithm Note] 꼬리 μ¬κ· ν¨μ (feat. Fibonacci)
μ λ² κΈμμ μ¬κ· ν¨μμ λν΄ λ€λ€λ€λ©΄, μ΄λ²μ '꼬리' μ¬κ· ν¨μμ λν΄ μ 리ν΄λ³΄λ €κ³ νλ€.
νΌλ³΄λμΉ μλ₯Ό ꡬνλ ν¨μλ₯Ό ꡬνν΄λ³΄λ©΄μ, μ¬κ·ν¨μμ λ¬Έμ μ μ μκ² λμλ€.
κ·Έλ°λ° μ΄ λ¬Έμ μ μ 꼬리 μ¬κ· ν¨μκ° ν΄κ²°ν΄ μ€λ€λ μ¬μ€μ μκ² λμλ€,,!!
λ°λΌμ μ€λμ 꼬리 μ¬κ· ν¨μλ₯Ό 곡λΆν΄λ³΄κ³ , ꡬν λ°©λ²κΉμ§ νμ€ν μ΄ν΄ν΄λ³΄μ.
π 꼬리 μ¬κ· ν¨μ(Tail Recursive Call)
꼬리 μ¬κ· ν¨μλ μΌλ°μ μΈ μ¬κ· ν¨μμ λ¨μ μ 보μνλ€.
μΌλ°μ μΈ μ¬κ· ν¨μκ° κ°μ§λ λ¨μ μ λ°λ‘
μ€ν μ€λ²νλ‘μ°κ° λ°μν μ μλ€λ μ ,,!!!π₯
μΌλ° μ¬κ·μ κ²½μ°, μ λ² κΈμμ λ€λ€λ―
μ€νμ ν¨μ νΈμΆμ νλμ© μκ³ , κ±°κΎΈλ‘ λ°ν κ°μ λκΈ°λ©° κ³μ°μ μννλ€.
(μ΄ λ΄μ©μ μκΈ°π κΈμ μ°Έκ³ ν΄μ£ΌμΈμ!)
[Swift Algorithm Note] μ¬κ·ν¨μ μ 리 (feat. Factorial)
λμΆ©μ μκ³ μμμ§λ§,, μ§κΈκΉμ§λ μκ³ λ¦¬μ¦μ λν μ νν κ°λ μμ΄ λ¬Έμ λ₯Ό ν΄κ²°ν΄μλ€. νμ§λ§ μ μ°¨ λ¬Έμ μμ€μ΄ λμμ§λ©΄μ μκ³ λ¦¬μ¦μ μ νν νμ νκ³ μμ΄ν νλ€λ κ²μ λλ,, λ°λΌμ
seolhee2750.tistory.com
κ°μ΄ λ무 컀μ ν¨μ νΈμΆμ μ~μ£Ό λ§μ΄ ν΄μΌ ν κ²½μ°μλ μ€ν μ€λ²νλ‘μ°κ° λ°μν μ μλ κ²μ΄λ€.
π μ΄λ¬ν μ μ 보μνκ³ , μ¬κ· ν¨μμ μ₯μ μ μ΄λ¦¬λ λ°©λ²μ΄ λ°λ‘ 꼬리 μ¬κ·μ΄λ€.
λ§λ‘ μ€λͺ ν기보λ€,
μ¬κ· ν¨μμ λνκ²©μΈ ν©ν λ¦¬μΌ ν¨μμ μΌλ° μ¬κ·, 꼬리 μ¬κ· ꡬνμ 보며 μ΄ν΄ν΄λ³΄μ.
// μΌλ° μ¬κ·
func Recursion(_ x: Int) -> Int {
if x == 1 { return 1 }
return x * Recursion(x-1)
}
// 꼬리 μ¬κ·
func tailRecursion(_ x: Int, _ result: Int) -> Int {
if x == 1 { return result }
return tailRecursion(x-1, x * result)
}
print(Recursion(3)) // 6
print(tailRecursion(3, 1)) // 6
π λ μ¬κ· ν¨μμ μ°¨μ΄μ
- νλΌλ―Έν°κ° νλ λ μΆκ°λμλ€.
: νλμ μΆκ°λ νλΌλ―Έν°λ κ³μ°μ λμ μ λ΄κΈ° μν¨μ΄λ€. - λ§μ§λ§ λ¬Έμ₯μ μ¬κ· λ°©μμ μ°¨μ΄κ° μλ€.
: μΌλ° μ¬κ·λ ν¨μμ νΈμΆκ³Ό μλ‘μ΄ κ³μ°μμ΄ λν΄μ‘λ€. νμ§λ§ 꼬리 μ¬κ·λ ν¨μ νΈμΆλ§μ΄ μ‘΄μ¬νλ€.
(꼬리 μ¬κ·λ return λ¬Έμμ μΆκ° κ³μ° μμ΄ ν¨μ νΈμΆλ§μΌλ‘ λλ΄κΈ° μν΄
1λ² λ¬Έν κ³μ° λμ μ©λμ νλΌλ―Έν°λ₯Ό μΆκ°ν κ²μ΄λ€.)
μ¬κΈ°μ μ κΉ,
μμμ 꼬리 μ¬κ·λ μΌλ° μ¬κ·μ μ€ν μ€λ²νλ‘μ° λ°μ κ°λ₯μ±μ 극볡νκΈ° μν λ°©λ²μ΄λΌκ³ λͺ μνλ€.
νμ§λ§ μ½λλ‘ λ΄μλ λΉμ·ν λ‘μ§μ²λΌ λκ»΄μ§λ€,,
κ·Έλ¦ΌμΌλ‘ λ ν¨μμ μ§ν λ°©μμ μμΈν μ΄ν΄λ³΄μ.
π λ μ¬κ· ν¨μμ μ§ν λ°©μ
βοΈμΌλ° μ¬κ· ν¨μ
μΌλ°μ μΈ μ¬κ· ν¨μλ μ λ² κΈμμ 곡λΆνλ―
μ€νμ μ°¨λ‘λλ‘ ν¨μ νΈμΆμ μκ³ , λ°ν κ°μ LIFO μμλ‘ μ λ¬νλ©° κ³μ°νμ¬
μ΅μ’ κ²°κ³Όλ₯Ό λ°ννλ λ°©μμ΄λ€.
βοΈ κΌ¬λ¦¬ μ¬κ· ν¨μ
꼬리 μ¬κ· ν¨μλ μ€νμ μμ§ μκ³ ,
λ λ²μ§Έ μΈμμ κ³μ° κ°μ λμ νλ©° μ λ¬νλ λ°©μμ΄λ€.
κ³μ λμ νλ€κ°, λ§μ§λ§μ ifλ¬Έμ 걸리면 λμ μΈμ κ°μ λ°ννλ€!
π μ€νμ μ¬μ©νμ§ μμ μ€ν μ€λ²νλ‘μ°κ° λ°μν μνμ΄ μλ€. !!
κ·ΈλΌ μ΄μ λ¬Έμ μ νΌλ³΄λμΉ ν¨μλ₯Ό 꼬리 μ¬κ·λ‘ ꡬνν΄λ³΄μ,,!!!!!
λ΄κ° μ΄ κΈμ μ°κ² λ κ³κΈ°κ° λ°λ‘ νΌλ³΄λμΉμ΄λ€.,,
μ¬κ·λ₯Ό 곡λΆνκ³ , νΌλ³΄λμΉ λ¬Έμ λ₯Ό λ€μ 보λ μ¬κ·λ‘ νλ©΄ μ’μ κ² κ°μ λ°λ‘ ν΄λ΄€λλ°,,
μ€λ₯κ° μΌλ¬΄μ§κ² λ°μνμ¬,, μ΄μ λ₯Ό μ°Ύλ€κ° μ¬κΈ°κΉμ§ μλ€.
π νΌλ³΄λμΉ μ κ³μ° ꡬν
νΌλ³΄λμΉ μλ₯Ό ꡬνλ ν¨μλ₯Ό μΌλ° μ¬κ·, 꼬리 μ¬κ·λ₯Ό μ΄μ©ν΄ κ°κ° ꡬννλ€.
// μΌλ° μ¬κ·
func Fibo(_ n: Int) -> Int {
if n == 0 || n == 1 { return n }
return Fibo(n - 1) + Fibo(n - 2)
}
// 꼬리 μ¬κ·
func tailFibo(_ num: Int, _ n: Int, _ sum: Int) -> Int {
if num == 1 { return sum }
return tailFibo(num - 1, sum, n + sum)
}
print(tailFibo(5, 0, 1))
print(Fibo(5))
μΌλ° μ¬κ·μ κ²½μ°, μμ μμμ²λΌ μμ μμ νΌλ³΄λμΉλ₯Ό ꡬν λλ λ¬Έμ κ° μμ§λ§
ν¨μ νΈμΆμ μμ£Ό λ§μ΄ λ°λ³΅ν΄μΌ νλ μν©μμλ μ€λ₯κ° λ°μνλ€.
꼬리 μ¬κ·μ κ²½μ°μλ 맨 λ€ μΈμ sumμ λμ λ κ³μ° κ²°κ³Όλ₯Ό λ°ννλ€.
λ°λΌμ μ€νμ μμ νμλ, μ€ν μ€λ²νλ‘μ° λ°μ κ°λ₯μ±λ μ¬λΌμ§λ€.
π μ 리
꼬리 μ¬κ· ν¨μλ μΌλ° μ¬κ· ν¨μμ λ¨μ μ 보μνλ€.
ν¨μ νΈμΆ μ€νμ μλ λμ νλΌλ―Έν°λ₯Ό μΆκ°νμ¬ κ³μ°μ λμ νλ€.
μ°Έκ³