์ถ์ฒ
ChatGPT
Tail Recursion Optimization ๋๋ Tail Call Optimization(TCO)๋ ํจ์๊ฐ tail call๋ก ๋๋๋ ์ฌ๊ท ํธ์ถ์ ์ต์ ํํ์ฌ ์คํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๋ ๊ธฐ๋ฒ์ด๋ค. ์ด ์ต์ ํ๋ ํจ์ ํธ์ถ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํด StackOverflowError๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
1. Tail Recursion(๊ผฌ๋ฆฌ ์ฌ๊ท)๋?
Tail Recursion์ด๋, ํจ์์ ๋ง์ง๋ง ๋์์ด ์์ ์ ํธ์ถํ๋ ํํ์ ์ฌ๊ท๋ฅผ ๋งํ๋ค. ์ฆ, ํจ์๊ฐ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ๋ ๋ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ๊ณง๋ฐ๋ก ๋ฐํ๋์ด ๋ ์ด์์ ๊ณ์ฐ์ด ํ์์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
์๋ ํจ์๋ tail recursive์ด๋ค.
fun tailRecFactorial(n: Int, accumulator: Int = 1): Int {
return if (n == 1) accumulator
else tailRecFactorial(n - 1, n * accumulator)
}
์ฌ๊ธฐ์ tailRecFactorial ํจ์์ ๋ง์ง๋ง ๋์์ tailRecFactorial(n - 1, n * accmulator)์ ํธ์ถํ๋ ๊ฒ์ด๋ค. ํธ์ถ๋ ํ์๋ ์๋ฌด๋ฐ ์ถ๊ฐ ์์
์ด ์๋ค. ์ด์ ๊ฐ์ ํํ๋ฅผ tail call์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
2. Tail Recursion Optimization์ ์๋ฆฌ
Tail Recursion Optimization์ tail recursive ํจ์ ํธ์ถ ์ ์๋ก์ด ์คํ ํ๋ ์์ ์์ฑํ์ง ์๊ณ ํ์ฌ ์คํ ํ๋ ์์ ์ฌ์ฌ์ฉํ๋๋ก ์ต์ ํํ๋ ๊ฒ์ด๋ค.
๋ณดํต์ ์ฌ๊ท ํธ์ถ์ ๊ฐ ํธ์ถ๋ง๋ค ์๋ก์ด ์คํ ํ๋ ์์ ์์ฑํด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ค. ์ด๋ฌํ ๋ฐฉ์์ ์ฌ๊ท ๊น์ด๊ฐ ๊น์ด์ง์๋ก ๋ง์ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ๊ณ , ๊ฒฐ๊ตญ StackOverflowError๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
๊ทธ๋ฌ๋ tail call์ ๊ฒฝ์ฐ ํ์ฌ ์คํ ํ๋ ์์ ์ฌ์ฌ์ฉํ ์ ์๋ค. ์๋ํ๋ฉด ํธ์ถ์ด ์๋ฃ๋ ํ์ ํ ์ผ์ด ๋ ์ด์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ๊ฐ ์คํ์ ๋ฎ์ด์ฐ๊ณ , ์๋ก์ด ์คํ ํ๋ ์์ ์ถ๊ฐํ์ง ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ํจ์จ์ ์ด๋ค.
3. Tail Recursion Optimization์ ์์
์ผ๋ฐ ์ฌ๊ท์ Tail Recursion์ ๋น๊ตํด๋ณด์.
์ผ๋ฐ ์ฌ๊ท(Non-Tail Recursion) ์์
fun factorial(n: Int): Int {
return if (n == 1) 1
else n * factorial(n - 1)
}
์ด ํจ์๋ factorial(n - 1) ํธ์ถ ํ์ 'n * ' ์ฐ์ฐ์ ์ํํด์ผ ํ๋ค. ๋ฐ๋ผ์ ์ด ์ฌ๊ท๋ tail recursive๊ฐ ์๋๋ค.
Tail Recursive ์์
fun tailRecFactorial(n: Int, accumulator: Int = 1): Int {
return if (n == 1) accumulator
else tailRecFactorial(n - 1, n * accumulator)
}
์ด ํจ์๋ tail recursive์ด๋ค. tailRecFactorial(n - 1, n * accumulator)์ด ๋ง์ง๋ง์ผ๋ก ํธ์ถ๋๋ ํจ์์ด๋ฉฐ, ๊ทธ ํ์ ๋ค๋ฅธ ์์
์ ์ํํ์ง ์๋๋ค.
Tail Recursion Optimization์ด ์๋ํ๋ค๋ฉด, tailRecFactorial์ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ๋์ง๋ง ์คํ ํ๋ ์์ด ์ถ๊ฐ๋์ง ์๊ณ ํ์ฌ ์คํ ํ๋ ์์ ์ฌ์ฌ์ฉํ๋ค.
4. Kotlin์์ Tail Recursion Optimization ์ ์ฉ
์ฝํ๋ฆฐ์์๋ tailrec ํค์๋๋ฅผ ์ฌ์ฉํด Tail Recursion Optimization์ด ๊ฐ๋ฅํจ์ ๋ช ์์ ์ผ๋ก ์์ฒญํ ์ ์๋ค.
tailrec fun tailRecFactorial(n: Int, accumulator: Int = 1): Int {
return if (n == 1) accumulator
else tailRecFactorial(n - 1, n * accumulator)
}
์ฌ๊ธฐ์ tailrec ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝํ๋ฆฐ ์ปดํ์ผ๋ฌ๊ฐ ์ด ํจ์๊ฐ tail call ์์ ์ธ์ํ๊ณ ์ต์ ํ๋ฅผ ์ ์ฉํ ์ ์๋ค. ๋ง์ฝ ํจ์๊ฐ tail call์ด ์๋ ๊ฒฝ์ฐ, ์ปดํ์ผ๋ฌ๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค.
โป ์๋ฐ๋ Tail Recursion Optimization์ ์ง์ํ์ง ์๋๋ค. ํ์ง๋ง ๋์ฒดํ๋ ๋ฐฉ๋ฒ๋ค์ด ์กด์ฌํ๋ค.
5. Tail Recursion Optimization์ ์ฅ์
ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
Tail Recursion Optimization์ ํตํด ์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์ผ๋ฉฐ, ์ด๋ StackOverflowError๋ฅผ ๋ฐฉ์งํ๋ค.
๋ ๋์ ์ฑ๋ฅ
์ต์ ํ๋ ์ฝ๋๋ ๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ , ์คํ ์ค๋ฒํค๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ ๋น ๋ฅด๊ฒ ์คํ๋ ์ ์๋ค.
๊ฐ๋ ์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ
์ฌ๊ท์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ์งํ๋ฉด์๋ ์คํ ์ฌ์ฉ์ ์ค์ผ ์ ์์ผ๋ฏ๋ก, ๋ณต์กํ ๋ฐ๋ณต ๊ตฌ์กฐ๋ณด๋ค ๊ฐ๊ฒฐํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
6. ์ ์ฝ ์ฌํญ ๋ฐ ์ฃผ์์
- ๋ชจ๋ ์ปดํ์ผ๋ฌ๊ฐ Tail Recursion Optimization์ ์ง์ํ๋ ๊ฒ์ ์๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ฐ์ ํ์ค JDK๋ Tail Recursion Optimization์ ์๋์ผ๋ก ์ง์ํ์ง ์์ง๋ง, Kotlin ์ปดํ์ผ๋ฌ๋ tailrec ํค์๋๋ก ์ด๋ฅผ ์ง์ํ๋ค.
- ์ฌ๊ท ํธ์ถ์ด ๋ฐ๋์ ํจ์์ ๋ง์ง๋ง ๋์์ด์ด์ผ ํ๋ฉฐ, ๋ค๋ฅธ ์ฐ์ฐ์ด ๋ค๋ฐ๋ผ์๋ ์ ๋๋ค.
- ์ฌ๊ท ํธ์ถ์ด ํ์ํ ๋ชจ๋ ๋ฌธ์ ์ Tail Recursion Optimization์ ์ ์ฉํ ์ ์๋ ๊ฒ์ ์๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ ํน์ฑ์ ๋ฐ๋ผ ์ต์ ํ ๊ฐ๋ฅ ์ฌ๋ถ๊ฐ ๊ฒฐ์ ๋๋ค.
๊ฒฐ๋ก
Tail Recursion Optimization์ ์ฌ๊ท ํธ์ถ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๋ ์ค์ํ ์ต์ ํ ๊ธฐ๋ฒ์ด๋ค. Kotlin๊ณผ ๊ฐ์ ํ๋์ ์ธ ์ธ์ด๋ ์ด๋ฅผ ์ง์ ์ ์ผ๋ก ์ง์ํ๋ฉฐ, ์ด ๊ธฐ๋ฒ์ ์ ํ์ฉํ๋ฉด ํจ์จ์ ์ธ ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ ์ ์๋ค. tailrec ํค์๋๋ฅผ ์ฌ์ฉํด ๋ช ์์ ์ผ๋ก ์ปดํ์ผ๋ฌ์๊ฒ ์ต์ ํ๋ฅผ ์์ฒญํ๋ ๊ฒ์ด ์ข์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ์ฝ๋์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ๋ชจ๋ ๊ฐ์ ํ ์ ์๋ค.
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์ฐธ์กฐ ๋๋ฌ ๊ฐ๋ฅ์ฑ reachability (3) | 2024.08.28 |
---|---|
[JVM] Out of Memory VS Memory Leak (0) | 2024.08.28 |
[Java] Tail Recursion Optimization ๋์ฒด ๋ฐฉ๋ฒ (0) | 2024.08.28 |
[Java][JVM] StackOverflowError์ ์์ธ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ (0) | 2024.08.27 |
[Java] ์์ธ, ์๋ฌ (0) | 2024.08.27 |