2024. 1. 22. 21:36ใCS - Roadmap.sh/3. Common Algorithms
CS - 3. Common Algorithms - 3.2. Recursion - 3.2.2 Non-Tail Recursion
๐กTail recursion is when a function can directly return the result of a recursive call - there are no outstanding operations, and there is no need for the call stack frame to be preserved. So it can be translated to a “goto with arguments”, and the stack usage will be constant.
In “non-tail recursion”, there are outstanding operations after the recursive call, and the stack frame cannot be nuked.
๊ผฌ๋ฆฌ ์ฌ๊ท๋ ํจ์๊ฐ ์ฌ๊ท ํธ์ถ์ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ๋ฐํํ ์ ์๋ ๊ฒฝ์ฐ๋ก, ๋ฏธ๊ฒฐ ์ฐ์ฐ์ด ์๊ณ ํธ์ถ ์คํ ํ๋ ์์ ๋ณด์กดํ ํ์๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ " goto with arguments ๋ก ๋ฒ์ญํ ์ ์์ผ๋ฉฐ ์คํ ์ฌ์ฉ๋์ ์ผ์ ํฉ๋๋ค.
"๋น๊ผฌ๋ฆฌ ์ฌ๊ท"์์๋ ์ฌ๊ท ํธ์ถ ์ดํ์ ๋ฏธ๊ฒฐ ์ฐ์ฐ์ด ์กด์ฌํ๋ฉฐ ์คํ ํ๋ ์์ ์์ ํ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
(cannot be nuked ๋ฅผ ์์ ํ ์ ๊ฑฐํ ์ ์๋ค๊ณ ํด์ํ๋๋ฐ ํ์คํ์ง ์๋ค.)
๋น-๊ผฌ๋ฆฌ ์ฌ๊ท(Non-Tail Recursion)๋ ์ฌ๊ท ํจ์์์ ์ฌ๊ท ํธ์ถ์ด ํจ์์ ๋ง์ง๋ง ์์ ์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด ๊ฒฝ์ฐ, ์ฌ๊ท ํธ์ถ ํ์ ์ถ๊ฐ๋ก ์ํํด์ผ ํ๋ ์์
์ด ๋จ์ ์์ผ๋ฏ๋ก, ์์คํ
์คํ์ ์ด์ ํจ์ ํธ์ถ์ ์ ๋ณด๋ฅผ ๊ณ์ ์ ์งํด์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ฒ ์ค๋ช
ํ์๋ฉด, ๋น-๊ผฌ๋ฆฌ ์ฌ๊ท๋ ์ฌ๊ท ํธ์ถ์ด ์ด๋ฃจ์ด์ง ํ์๋ ๋ค๋ฅธ ์์
์ ์ํํด์ผ ํ๊ธฐ ๋๋ฌธ์, ์ฌ๊ท ํธ์ถ์ด ๋๋ ํ์ ์ด์ ์ํ๋ก ๋์์์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ ์คํ์ ์ด์ ํจ์ ํธ์ถ์ ์ ๋ณด๋ฅผ ๋ณด๊ดํด์ผ ํฉ๋๋ค.
In Python
ํ์ด์ฌ์์ ๋น-๊ผฌ๋ฆฌ ์ฌ๊ท๋ฅผ ๊ตฌํํ๋ ์์๋ ์ ๋ฒ์ ์์ฑํ๋ ํฉํ ๋ฆฌ์ผ ๊ณ์ฐ์ ๋๋ค.
def factorial_nontail(n):
if n == 1:
return 1
else:
return n * factorial_nontail(n - 1)
์ฌ๊ธฐ์ ๊ผฌ๋ฆฌ ์ฌ๊ท๋ก ๊ตฌํํ๊ฒ ๋๋ค๋ฉด
def factorial_tail(n, acc=1):
if n == 1:
return acc
else:
return factorial_tail(n-1, n*acc)
์ด๋ฐ์์ผ๋ก ๋ฐ๊ฟ์ ์์ต๋๋ค.
์์ factorial_nontail ํจ์์์ ๋ง์ง๋ง์ค factorial_nontail(n-1)์ด ์ฌ๊ท ํธ์ถ์ด๋ฉฐ,
์ด ํธ์ถ ํ์ n * ์ฐ์ฐ์ด ์ํ๋๋ฏ๋ก ๋น-๊ผฌ๋ฆฌ ์ฌ๊ท์ ๋๋ค.
์ด๋ฌํ ๋น-๊ผฌ๋ฆฌ ์ฌ๊ท๋ ํฉํ ๋ฆฌ์ผ ๊ณ์ฐ ์ธ์๋
ํธ๋ฆฌ ๊ตฌ์กฐ์ ํ์, DFS ๋ฑ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉ๋ฉ๋๋ค.
ํ์ง๋ง ๋น-๊ผฌ๋ฆฌ ์ฌ๊ท๋ ๊ผฌ๋ฆฌ ์ฌ๊ท์ ๋นํด ์คํ์ค๋ฒํ๋ก์ฐ ์ํ์ด ๋์ผ๋ฏ๋ก, ์ฌ๊ท ๊น์ด๊ฐ ๊น์ด์ง ๊ฒฝ์ฐ๋ฅผ ์กฐ์ฌํด์ผํฉ๋๋ค.
์ ๋น-๊ผฌ๋ฆฌ ์ฌ๊ท๊ฐ ๊ผฌ๋ฆฌ ์ฌ๊ท์ ๋นํด์ ์คํ์ค๋ฒํ๋ก์ฐ ์ํ์ด ๋์๊น์?
์์์ ๋น-๊ผฌ๋ฆฌ ์ฌ๊ท๋ ์ฌ๊ท ํธ์ถ ์ดํ์๋ ๋ค๋ฅธ ์์ ์ ์ํํด์ผ ํ๊ธฐ๋๋ฌธ์, ์ฌ๊ท ํธ์ถ์ด ๋๋ ํ์ ์ด์ ์ํ๋ก ๋์์์ผ ํ๋ค๊ณ ํ์ต๋๋ค.
๋ฐ๋ผ์ ๊ฐ ์ฌ๊ท ํธ์ถ์ ๋ํ ์ ๋ณด๋ฅผ ์คํ์ ๊ณ์ ์ ์ฅํด์ผ ํฉ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด ์ฌ๊ท ํธ์ถ์ด ๋ง์์ง์๋ก ์คํ์ ์ ์ฅ๋๋ ์ ๋ณด์ ์์ด ๋์ด๋๊ณ , ์ด๋ ๊ฒฐ๊ตญ ์คํ ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์ ๊ผฌ๋ฆฌ ์ฌ๊ท์์๋ ์ฌ๊ท ํธ์ถ์ด ํจ์์ ๋ง์ง๋ง ์์
์ด๋ฏ๋ก, ์ฌ๊ท ํธ์ถ ํ์ ์ฒ๋ฆฌํด์ผ ํ ์์
์ด ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด์ ์ฌ๊ท ํธ์ถ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์งํ ํ์๊ฐ ์์ด, ์คํ์ ์ ์ฅ๋๋ ์ ๋ณด์ ์์ด ์ ์ด์ง๋๋ค.
์ด๋ฌํ ํน์ฑ ๋๋ฌธ์ ๊ผฌ๋ฆฌ ์ฌ๊ท๋ ๋น-๊ผฌ๋ฆฌ ์ฌ๊ท์ ๋นํด ์คํ ์ค๋ฒํ๋ก์ฐ ์ํ์ด ์ ์ต๋๋ค.
(ํ์ง๋ง ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฐ๋ผ ๊ผฌ๋ฆฌ์ฌ๊ท ์ต์ ํ๋ฅผ ์ง์ํ๋๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๊น์ด์ง์ง ์๋๋ก ์ฃผ์๋ ํด์ผํฉ๋๋ค. ํ์ด์ฌ๋ ๊ผฌ๋ฆฌ์ฌ๊ท ์ต์ ํ๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.)
'CS - Roadmap.sh > 3. Common Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
3.3. Search - 3.3.2 Linear Search (1) | 2024.01.24 |
---|---|
3.3. Search - 3.3.1 Binary Search (0) | 2024.01.23 |
3.2. Recursion - 3.2.1 Tail Recursion (0) | 2024.01.21 |
3.1. Sorting - 3.1.6 Merge Sort (0) | 2024.01.20 |
3.1 Sorting - 3.1.5 Quick Sort (0) | 2024.01.16 |