์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Python
- ์ปดํจํฐ๊ณผํ
- K๋ฐฐํฐ๋ฆฌ๋ ๋ณผ๋ฃจ์
- JavaScript
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ค๋ธ์
- ์๋ฐ์คํฌ๋ฆฝํธ
- css
- ๊น๋ฏธ๊ฒฝ์๋งํ์์
- ComputerScience
- ์นํผ๋ธ๋ฆฌ์ฑ
- ๋ผํ๋ผ์ค์๋ง๋
- ๊ฐ๋ฐ
- ๋ ์
- ๋ฆฌ์กํธ
- ํ๋ก๊ทธ๋๋ฐ
- K๋ฐฐํฐ๋ฆฌ
- ๋ง์ผ๋ด๊ฐ์ธ์์๋ค์์ฐ๋ค๋ฉด
- database
- Java
- ๋ฐ์ํ
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ์ํ
- ์นํ์ด์ง๋ง๋ค๊ธฐ
- ์ฑ
- ์ฝ๋ฉ
- ์ค๋ผํด
- html
- ํ์ด์ฌ
- ์๋ฐ
- Today
- Total
JiYoung Dev ๐ฅ
[ํ์ด์ฌ] ์ฌ๊ท ํจ์(Recursive Function) ๋ณธ๋ฌธ
2023.02.18 ์ฝ๋์ ํ์ต๋ด์ฉ ์ ๋ฆฌ
์ฌ๊ท (Recursion)
์ฌ๊ท๋ '์๊ธฐ ์์ ์ ํธ์ถํ๋ ๊ฒ'
์ฌ๊ท ํจ์ (Recursive Function)
์๊ธฐ ์์ ์ ํธ์ถํ๋ ํจ์
๐ ํฉํ ๋ฆฌ์ผ
์ฌ๊ท์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํผ๋ค๋ ๊ฒ์ ๊ฐ์ ํํ์ ๋ ์์ ๋ฌธ์ (๋ถ๋ถ ๋ฌธ์ ; sub problem)๋ฅผ ํ๊ณ ๋ถ๋ถ ๋ฌธ์ ์ ๋ต์ ์ด์ฉํด์ ๊ธฐ์กด ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์ ๋งํจ
์๋์ ๊ฐ์ด f(n)์ ๊ตฌํ๊ธฐ ์ํด f(n-1)์ ๊ฐ์ ์ด์ฉํ๋ ๊ฒ์ฒ๋ผ ๊ท์น์ ์ฐพ์์ ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ
f(5) = 5! = 5 * 4 * 3 * 2 * 1 = 5 * 4! = 5 * f(4)
f(4) = 4! = 4 * 3 * 2 * 1 = 4 * 3! = 4 * f(3)
f(3) = 3! = 3 * 2! = 3 * f(2)
...
f(n) = n! = n * (n-1)! = n * f(n-1)
๋จ, n=0์ผ ๊ฒฝ์ฐ๋ 1
์ฌ๊ท ํจ์ ๋ฌธ์ ๋ฅผ ํ ๋๋ ํญ์ base case์ recursive case๋ก ๊ฒฝ์ฐ๋ฅผ ๋๋์ด์ฃผ์ด์ผ ํจ
base case ์ฆ, ํ์ถ ์กฐ๊ฑด์ด ์์ด์ผ ํจ์๋ฅผ ๋๋ผ ์ ์์
base case๋ ๋ฌธ์ ๊ฐ ์ถฉ๋ถํ ์์์ ๋ฐ๋ก ํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํจ (๋ฐ๋ก ํ์ด์ผ ํ๋ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ)
์ฌ๊ท ํจ์์์ base case๋ฅผ ์ ์ํ์ง ์์ผ๋ฉด ํจ์๊ฐ ๋๋์ง ์์
์์ ํฉํ ๋ฆฌ์ผ ๋ฌธ์ ์์
base case : n = 0์ธ๊ฒฝ์ฐ n! = 1
recursive case : n > 0์ธ ๊ฒฝ์ฐ n! = (n-1)! X n
๐ ์ฌ๊ท ํจ์ vs ๋ฐ๋ณต๋ฌธ
๋ฐ๋ณต๋ฌธ์ผ๋ก ํ ์ ์๋ ๋ฌธ์ ๋ ์ฌ๊ท ํจ์๋ก ํ ์ ์๊ณ , ์ฌ๊ท ํจ์๋ก ํ ์ ์๋ ๋ฌธ์ ๋ ๋ฐ๋ณต๋ฌธ์ผ๋ก ํ ์ ์์
๊ทธ๋ฌ๋ ์ฌ๊ท ํจ์์๋ ๋จ์ ์ด ์์
์ฌ๊ท ํจ์์์๋ ๋์ผํ ํจ์๋ฅผ ๊ณ์ํด์ ํธ์ถํ ๋๋ง๋ค ํจ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ณ์ํด์ ํ ๋น๋จ. ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์ฌ์ฉ๋๋ ์์ ์ ์ฅ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฝ ์คํ(call stack : ํจ์๊ฐ ๋๋ ์์น๋ฅผ ๊ธฐ๋กํด ๋๋ ๊ฒ)์ด๋ผ๊ณ ๋ถ๋ฆ. ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ์ ๋ ๋ฌดํ๋ฃจํ์ ๋น ์ง๊ฑฐ๋ ์ฌ๊ท ํจ์ ํธ์ถ์ด ๋๋ฌด ๋ง์ผ๋ฉด ์ฝ ์คํ์ด ์์ด๋ฉด์ ์คํ ๊ณต๊ฐ์ด ์ด๊ณผ๋๋ ์คํ ์ค๋ฒํ๋ก ์ค๋ฅ (StackOverflowError)๊ฐ ๋ฐ์. ํ์ด์ฌ์์๋ ์ฝ ์คํ์ 1000๊ฐ ๊น์ง๋ง ํ์ฉํจ
๋ฐ๋ณต๋ฌธ์ ์ฐ๋ ๊ฒ ๋ ๊น๋ํ๊ฑฐ๋ ํจ์จ์ ์ผ ๋๊ฐ ์๊ณ , ์ฌ๊ท ํจ์๋ฅผ ์ฐ๋ ๊ฒ ๋ ๊น๋ํ๊ฑฐ๋ ํจ์จ์ ์ผ ๋๊ฐ ์๋๋ฐ ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ์ฌ์ฉํ๊ณ , ์ฝ์คํ์ด ์์ด๋ ๋ฌธ์ ๊ฐ ์์๋๋ฉด ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉ
๐ ํผ๋ณด๋์น ์์ด
์ฌ๊ท ํจ์ ์๋ FLOW
i == 1 : fib(1)
return 1
i == 2 : fib(2)
return 1
i == 3 : fib(3)
fib(1) + fib(2) = 1 + 1 = 2
i == 4 : fib(4)
fib(2) + fib(3) = 1 + 2 = 3
...
i == 10 : fib(10)
fib(8) + fib(9) = 55
์ฝ์ ์ถ๋ ฅ๊ฐ
1
1
2
3
...
55
๐ n์ ๊ฐ ์๋ฆฟ์์ ํฉ ๊ตฌํ๊ธฐ
โผโผ ๋ด๊ฐ ์์ฑํ ์ฝ๋ : sum_counts ๋ฅผ ์ฌ๊ท ํจ์๋ก ์ฌ์ฉ
์ซ์ n์ ๋ฌธ์์ด n์ผ๋ก ๋ณํ → str_n
n์ ์๋ฆฟ์ ๊ณ์ฐ → count_digits
๋ฌธ์์ด๋ก ๋ณํํ n์ ๋งจ ๋ท์๋ฆฌ์์๋ถํฐ์ ํฉ์ ๊ตฌํ๋ ํจ์ : sum_counts
base case : 1์๋ฆฟ์ ์ผ๋ (count_digits == 1์ผ ๊ฒฝ์ฐ)์๋ str_n[0] return
recursive case : 2์๋ฆฟ์ ์ด์์ธ ๊ฒฝ์ฐ ๊ฐ ์๋ฆฟ์์ ํฉ ๋ํ๊ธฐ
sum_digits(n)์ ๋ํ์ฌ sum_counts(์๋ฆฟ์) return
์ :
n = 22541
str_n = "22541"
count_digits = 5
sum_counts(5) return
sum_counts(4) + int("22541"[4]) = sum_counts(4) + 1 = 13 + 1 = 14
sum_counts(3) + int("22541"[3]) = sum_counts(3) + 4 = 9 + 4 = 13
sum_counts(2) + int("22541"[2]) = sum_counts(1) + 5 = 4 + 5 = 9
sum_counts(1) + int('22541"[1]) = 2+2 = 4
sum_counts(1) = int("22541"[0]) = 2
(ํ๋์์ ์๋ฐฉํฅ์ผ๋ก ์งํ๋๋ ๊ณผ์ )
โผโผ ๋ชจ๋ฒ ๋ต์ : // ์ % ํ์ฉํ์ฌ ์ฝ๊ฒ ์์ฑํ ์ ์์
base case
n์ด 10๋ณด๋ค ์์ผ๋ฉด n return
recursive case
sum_digits(22541) → 22541 % 10 + sum_digits(22541 // 10) = 1 + sum_digits(2254) = 1 + 13 = 14
sum_digits(2254) → 2254 % 10 + sum_digits(2254 // 10) = 4 + sum_digits(225) = 4 + 9 = 13
sum_digits(225) → 225 % 10 + sum_digits(225 // 10) = 5 + sum_digits(22) = 5 + 4 = 9
sum_digits(22) → 22 % 10 + sum_digits(22 // 10) = 2 + sum_digits(2) = 2 + 2 = 4
sum_digits(2) → 2 return
๐ ๋ฆฌ์คํธ ๋ค์ง๊ธฐ
๊ท์น ์ฐพ๊ธฐ
some_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
9 + [1, 2, 3, 4, 5, 6, 7, 8 ๋ค์ง๊ธฐ]
8 + [1, 2, 3, 4, 5, 6, 7 ๋ค์ง๊ธฐ]
7 + [1, 2, 3, 4, 5, 6 ๋ค์ง๊ธฐ]
...
2 + [1 ๋ค์ง๊ธฐ]
[ ๋ค์ง๊ธฐ] → flip(some_list[ :1]
๐ ํ๋ ธ์ด์ ํ
๊ท์น์ฐพ๊ธฐ
๊ธฐ๋ฅ์ ์ด 3๊ฐ → start_peg = 1, end_peg = 2
๋ง์ฝ ์ํ์ด ์๋ค๋ฉด, ํจ์๋ ๊ทธ๋๋ก ๋๋จ
if num_disks == 0 : return
์ํ์ด 1๊ฐ๋ผ๋ฉด,
1๋ฒ ์ํ์ 1๋ฒ ๊ธฐ๋ฅ์์ 3๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ด๋
์ํ์ด 2๊ฐ๋ผ๋ฉด,
1๋ฒ ์ํ์ 1๋ฒ ๊ธฐ๋ฅ์์ 2๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ด๋
2๋ฒ ์ํ์ 1๋ฒ ๊ธฐ๋ฅ์์ 3๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ด๋
1๋ฒ ์ํ์ 2๋ฒ ๊ธฐ๋ฅ์์ 3๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ด๋
์ํ์ด 3๊ฐ๋ผ๋ฉด,
1๋ฒ ์ํ์ 1๋ฒ ๊ธฐ๋ฅ์์ 3๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ด๋
2๋ฒ ์ํ์ 1๋ฒ ๊ธฐ๋ฅ์์ 2๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ด๋
1๋ฒ ์ํ์ 3๋ฒ ๊ธฐ๋ฅ์์ 2๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ด๋ → ์ํ 2๊ฐ์ผ ๋์ ๊ฐ์. ๋จ 2๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ด๋ํ๋ ๊ฒ๋ง ๋ค๋ฆ
3๋ฒ ์ํ์ 1๋ฒ ๊ธฐ๋ฅ์์ 3๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ด๋
1๋ฒ ์ํ์ 2๋ฒ ๊ธฐ๋ฅ์์ 1๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ด๋ → ์ํ 2๊ฐ์ผ ๋์ ๊ฐ์. ๋จ 2๋ฒ ๊ธฐ๋ฅ์์ 3๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ด๋ํด์ผ ํจ
2๋ฒ ์ํ์ 2๋ฒ ๊ธฐ๋ฅ์์ 3๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ด๋
1๋ฒ ์ํ์ 1๋ฒ ๊ธฐ๋ฅ์์ 3๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ด๋
...
์ํ์ด num_disks๋ผ๋ฉด,
1๋ฒ๋ถํฐ num_disks - 1๋ฒ๊น์ง์ ์ํ์ 1๋ฒ ๊ธฐ๋ฅ(start_peg)์์ 2๋ฒ ๊ธฐ๋ฅ(other_peg)์ผ๋ก ์ด๋
num_disks์ ์ํ์ 1๋ฒ ๊ธฐ๋ฅ(strart_peg)์์ 3๋ฒ ๊ธฐ๋ฅ(end_peg)์ผ๋ก ์ด๋
1๋ฒ๋ถํฐ num_disks - 1๋ฒ๊น์ง์ ์ํ์ 2๋ฒ ๊ธฐ๋ฅ(other_peg)์์ 3๋ฒ ๊ธฐ๋ฅ(end_peg)์ผ๋ก ์ด๋
์ด๋ฅผ ์ฝ๋๋ก ์์ฑํ๋ฉด,
hanoi(num_disks - 1, start_peg, other_peg)
move_disk(num_disks, strat_peg, end_peg)
hanoi(num_disks - 1, other_peg, end_peg)
์ฌ๊ธฐ์ start_peg = 1, end_peg = 3, other_peg = 2 → ์ธ ๊ฐ์ ํฉ์ 6
๋ฐ๋ผ์ other_peg = 6 - start_peg - end_peg