๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
5๏ธโƒฃ CS/Algorithm

[Swift Algorithm Note] ๊ผฌ๋ฆฌ ์žฌ๊ท€ ํ•จ์ˆ˜ (feat. Fibonacci)

by seolhee2750 2021. 7. 9.

์ €๋ฒˆ ๊ธ€์—์„œ ์žฌ๊ท€ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋‹ค๋ค˜๋‹ค๋ฉด, ์ด๋ฒˆ์—” '๊ผฌ๋ฆฌ' ์žฌ๊ท€ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด์„œ, ์žฌ๊ท€ํ•จ์ˆ˜์˜ ๋ฌธ์ œ์ ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด ๋ฌธ์ œ์ ์„ ๊ผฌ๋ฆฌ ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ํ•ด๊ฒฐํ•ด ์ค€๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค,,!!

๋”ฐ๋ผ์„œ ์˜ค๋Š˜์€ ๊ผฌ๋ฆฌ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ๊ณต๋ถ€ํ•ด๋ณด๊ณ , ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๊นŒ์ง€ ํ™•์‹คํžˆ ์ดํ•ดํ•ด๋ณด์ž.

 

๐Ÿ“Ž ๊ผฌ๋ฆฌ ์žฌ๊ท€ ํ•จ์ˆ˜(Tail Recursive Call)

๊ผฌ๋ฆฌ ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์ธ ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•œ๋‹ค.

 

์ผ๋ฐ˜์ ์ธ ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ๊ฐ€์ง€๋Š” ๋‹จ์ ์€ ๋ฐ”๋กœ

์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ,,!!!๐Ÿ’ฅ

 

์ผ๋ฐ˜ ์žฌ๊ท€์˜ ๊ฒฝ์šฐ, ์ €๋ฒˆ ๊ธ€์—์„œ ๋‹ค๋ค˜๋“ฏ

์Šคํƒ์— ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ•˜๋‚˜์”ฉ ์Œ“๊ณ , ๊ฑฐ๊พธ๋กœ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋„˜๊ธฐ๋ฉฐ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

(์ด ๋‚ด์šฉ์€ ์š”๊ธฐ๐Ÿ‘‡ ๊ธ€์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!)

2021.07.08 - [๐Ÿ“ Algorithm Note/๐Ÿ” with Swift] - [Swift Algorithm Note] ์žฌ๊ท€ํ•จ์ˆ˜ ์ •๋ฆฌ (feat. Factorial)

 

[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

๐Ÿ“Œ ๋‘ ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์ฐจ์ด์ 

  1. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
    : ํ•˜๋‚˜์˜ ์ถ”๊ฐ€๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ณ„์‚ฐ์˜ ๋ˆ„์ ์„ ๋‹ด๊ธฐ ์œ„ํ•จ์ด๋‹ค.
  2. ๋งˆ์ง€๋ง‰ ๋ฌธ์žฅ์˜ ์žฌ๊ท€ ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
    : ์ผ๋ฐ˜ ์žฌ๊ท€๋Š” ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ๊ณผ ์ƒˆ๋กœ์šด ๊ณ„์‚ฐ์‹์ด ๋”ํ•ด์กŒ๋‹ค. ํ•˜์ง€๋งŒ ๊ผฌ๋ฆฌ ์žฌ๊ท€๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ๋งŒ์ด ์กด์žฌํ•œ๋‹ค.
    (๊ผฌ๋ฆฌ ์žฌ๊ท€๋Š” 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์— ๋ˆ„์ ๋œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์Šคํƒ์„ ์Œ“์„ ํ•„์š”๋„, ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ๋„ ์‚ฌ๋ผ์ง„๋‹ค.


๐Ÿ‘€ ์ •๋ฆฌ

๊ผฌ๋ฆฌ ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•œ๋‹ค.

ํ•จ์ˆ˜ ํ˜ธ์ถœ ์Šคํƒ์„ ์Œ“๋Š” ๋Œ€์‹  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ณ„์‚ฐ์„ ๋ˆ„์ ํ•œ๋‹ค.

 


์ฐธ๊ณ 

๋Œ“๊ธ€