3.2. Recursion - 3.2.2 Non-Tail Recursion

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 ๋“ฑ ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋น„-๊ผฌ๋ฆฌ ์žฌ๊ท€๋Š” ๊ผฌ๋ฆฌ ์žฌ๊ท€์— ๋น„ํ•ด ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์œ„ํ—˜์ด ๋†’์œผ๋ฏ€๋กœ, ์žฌ๊ท€ ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์งˆ ๊ฒฝ์šฐ๋ฅผ ์กฐ์‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

์™œ ๋น„-๊ผฌ๋ฆฌ ์žฌ๊ท€๊ฐ€ ๊ผฌ๋ฆฌ ์žฌ๊ท€์— ๋น„ํ•ด์„œ ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์œ„ํ—˜์ด ๋†’์„๊นŒ์š”?

 

์•ž์—์„œ ๋น„-๊ผฌ๋ฆฌ ์žฌ๊ท€๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ ์ดํ›„์—๋„ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ๋•Œ๋ฌธ์—, ์žฌ๊ท€ ํ˜ธ์ถœ์ด ๋๋‚œ ํ›„์— ์ด์ „ ์ƒํƒœ๋กœ ๋Œ์•„์™€์•ผ ํ•œ๋‹ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. 

๋”ฐ๋ผ์„œ ๊ฐ ์žฌ๊ท€ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์Šคํƒ์— ๊ณ„์† ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์žฌ๊ท€ ํ˜ธ์ถœ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ์Šคํƒ์— ์ €์žฅ๋˜๋Š” ์ •๋ณด์˜ ์–‘์ด ๋Š˜์–ด๋‚˜๊ณ , ์ด๋Š” ๊ฒฐ๊ตญ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ๊ผฌ๋ฆฌ ์žฌ๊ท€์—์„œ๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ์ด ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ์ž‘์—…์ด๋ฏ€๋กœ, ์žฌ๊ท€ ํ˜ธ์ถœ ํ›„์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ž‘์—…์ด ์—†์Šต๋‹ˆ๋‹ค. 

๋”ฐ๋ผ์„œ ์ด์ „ ์žฌ๊ท€ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์–ด, ์Šคํƒ์— ์ €์žฅ๋˜๋Š” ์ •๋ณด์˜ ์–‘์ด ์ ์–ด์ง‘๋‹ˆ๋‹ค. 

์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•Œ๋ฌธ์— ๊ผฌ๋ฆฌ ์žฌ๊ท€๋Š” ๋น„-๊ผฌ๋ฆฌ ์žฌ๊ท€์— ๋น„ํ•ด ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์œ„ํ—˜์ด ์ ์Šต๋‹ˆ๋‹ค.

 

(ํ•˜์ง€๋งŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋”ฐ๋ผ ๊ผฌ๋ฆฌ์žฌ๊ท€ ์ตœ์ ํ™”๋ฅผ ์ง€์›ํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊นŠ์–ด์ง€์ง€ ์•Š๋„๋ก ์ฃผ์˜๋Š” ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ๋„ ๊ผฌ๋ฆฌ์žฌ๊ท€ ์ตœ์ ํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

 

 

728x90

'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