์ ๋ฒ ๊ธ์์ ์ฌ๊ท ํจ์์ ๋ํด ๋ค๋ค๋ค๋ฉด, ์ด๋ฒ์ '๊ผฌ๋ฆฌ' ์ฌ๊ท ํจ์์ ๋ํด ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ํจ์๋ฅผ ๊ตฌํํด๋ณด๋ฉด์, ์ฌ๊ทํจ์์ ๋ฌธ์ ์ ์ ์๊ฒ ๋์๋ค.
๊ทธ๋ฐ๋ฐ ์ด ๋ฌธ์ ์ ์ ๊ผฌ๋ฆฌ ์ฌ๊ท ํจ์๊ฐ ํด๊ฒฐํด ์ค๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์๋ค,,!!
๋ฐ๋ผ์ ์ค๋์ ๊ผฌ๋ฆฌ ์ฌ๊ท ํจ์๋ฅผ ๊ณต๋ถํด๋ณด๊ณ , ๊ตฌํ ๋ฐฉ๋ฒ๊น์ง ํ์คํ ์ดํดํด๋ณด์.
๐ ๊ผฌ๋ฆฌ ์ฌ๊ท ํจ์(Tail Recursive Call)
๊ผฌ๋ฆฌ ์ฌ๊ท ํจ์๋ ์ผ๋ฐ์ ์ธ ์ฌ๊ท ํจ์์ ๋จ์ ์ ๋ณด์ํ๋ค.
์ผ๋ฐ์ ์ธ ์ฌ๊ท ํจ์๊ฐ ๊ฐ์ง๋ ๋จ์ ์ ๋ฐ๋ก
์คํ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ์ ,,!!!๐ฅ
์ผ๋ฐ ์ฌ๊ท์ ๊ฒฝ์ฐ, ์ ๋ฒ ๊ธ์์ ๋ค๋ค๋ฏ
์คํ์ ํจ์ ํธ์ถ์ ํ๋์ฉ ์๊ณ , ๊ฑฐ๊พธ๋ก ๋ฐํ ๊ฐ์ ๋๊ธฐ๋ฉฐ ๊ณ์ฐ์ ์ํํ๋ค.
(์ด ๋ด์ฉ์ ์๊ธฐ๐ ๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ธ์!)
๊ฐ์ด ๋๋ฌด ์ปค์ ํจ์ ํธ์ถ์ ์~์ฃผ ๋ง์ด ํด์ผ ํ ๊ฒฝ์ฐ์๋ ์คํ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฒ์ด๋ค.
๐ ์ด๋ฌํ ์ ์ ๋ณด์ํ๊ณ , ์ฌ๊ท ํจ์์ ์ฅ์ ์ ์ด๋ฆฌ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ๊ผฌ๋ฆฌ ์ฌ๊ท์ด๋ค.
๋ง๋ก ์ค๋ช ํ๊ธฐ๋ณด๋ค,
์ฌ๊ท ํจ์์ ๋ํ๊ฒฉ์ธ ํฉํ ๋ฆฌ์ผ ํจ์์ ์ผ๋ฐ ์ฌ๊ท, ๊ผฌ๋ฆฌ ์ฌ๊ท ๊ตฌํ์ ๋ณด๋ฉฐ ์ดํดํด๋ณด์.
// ์ผ๋ฐ ์ฌ๊ท
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์ ๋์ ๋ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
๋ฐ๋ผ์ ์คํ์ ์์ ํ์๋, ์คํ ์ค๋ฒํ๋ก์ฐ ๋ฐ์ ๊ฐ๋ฅ์ฑ๋ ์ฌ๋ผ์ง๋ค.
๐ ์ ๋ฆฌ
๊ผฌ๋ฆฌ ์ฌ๊ท ํจ์๋ ์ผ๋ฐ ์ฌ๊ท ํจ์์ ๋จ์ ์ ๋ณด์ํ๋ค.
ํจ์ ํธ์ถ ์คํ์ ์๋ ๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํ์ฌ ๊ณ์ฐ์ ๋์ ํ๋ค.
์ฐธ๊ณ
'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. Factorial) (0) | 2021.07.08 |
๋๊ธ