Bibi's DevLog ๐ค๐
[์ธํ๋ฐ] Javascript - ์ฌ๊ท์ ๊ธฐ์ด2 (์ ํ์, ํผ๋ณด๋์น์์ด, ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ memoization) ๋ณธ๋ฌธ
[์ธํ๋ฐ] Javascript - ์ฌ๊ท์ ๊ธฐ์ด2 (์ ํ์, ํผ๋ณด๋์น์์ด, ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ memoization)
๋น๋น bibi 2020. 11. 1. 20:34* ์ด ๊ธ์ ์ธํ๋ฐ์์ ์ ๊ณตํ๋ ํธ๋ ์ค๋์ ์ ๋ฃ ๊ฐ์ '์ฝ๊ณ ์์ฐ์ค๋ฝ๊ฒ ๋ฐฐ์๋ณด๋ Javascript ์ ๋ฌธ - ์ฝ๋์ค์ฟผ๋ ๋ง์คํฐ์ฆ ์ฝ์ค ๋ ๋ฒจ1'๋ฅผ ๋ฃ๊ณ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ๊ฐ์ ๋ด์ฉ์ ๋ํด, ์ ๊ฐ ํ๊ธฐํ๊ณ ๊ตฌ๊ธ๋งํ ๋ด์ฉ์ด ์ ๋ฆฌ๋์ด ์์ต๋๋ค. ์ด๋ณด์ธ ์ ๊ฐ ์ดํดํ ๋๋ก ์ ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ๋ถ์ ํํ ๋ด์ฉ์ด ์์ ์ ์์์ ๊ฐ์ํด ์ฃผ์๊ธธ ๋ฐ๋๋๋ค. ๊ฐ์๋ฅผ ๋ฃ๊ณ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค๋ ์ธํ๋ฐ ์ธก ๋ต๋ณ์ ๋ฐ์ ์ ์ด ์์ผ๋(https://bibi6666667.tistory.com/37), ์ ์๊ถ์ ๋ฌธ์ ๊ฐ ๋๋ค๋ฉด ๋ณดํธ ๋ชจ๋(๋น๊ณต๊ฐ)๋ก ์ ํํ๊ฒ ์ต๋๋ค.
์ ํ์
์ฌ๊ท๋ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๋ ๊ฑธ๋ก ๋ฌธ์ ๋ฅผ ํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ ์ํ ๊ณต์์
๋๋ค.
(๊ตฌ๊ธ๋ง) ์ ํ์ (= ์ฌ๊ท์, recurrence relation)
: (์ํ)์์ด์์ ์ด์ํ๋ ๋๊ฐ์ ํญ ์ฌ์ด์ ์ฑ๋ฆฝํ๋ ๊ด๊ณ๋ฅผ ๋ํ๋ธ ๊ด๊ณ์์ด๋ค.
์ฌ๊ท๋ก ํผ๋ณด๋์น ์์ด ๊ตฌํํ๊ธฐ
ํผ๋ณด๋์น ์์ด์ด๋ ์ค๋ ๋ ์ํ ๋ฌธ์ ์ค ํ๋์ ๋๋ค. ๋ฌด์ธ๋ ํ ๋ผ ๋ฌธ์ ๋ก๋ ์๋ ค์ ธ ์์ต๋๋ค.
์ฐธ๊ณ : ํผ๋ณด๋์น ์์ด
โป ์๊ธฐ ํ ๋ผ๋ ๋ค ์๋ผ๋ ๋ฐ ํ ๋ฌ์ด ๊ฑธ๋ฆฌ๋ฉฐ, ๋ค ์๋ ํ ๋ผ๋ ์๊ธฐ ํ ๋ผ๋ฅผ ํ ์ ๋ณ๋๋ค.
ํ ๋ผ๋ ๋์ง ์๊ณ ์์ํ ์๊ธฐ ํ ๋ผ๋ฅผ ๋ณ์ ์ ์๋ค.
์ด๋ค ๋ฌด์ธ๋์ ์๊ธฐ ํ ๋ผ๊ฐ ํ ์ ๋ค์ด์จ๋ค.
ํ ๋ฌ ๋ค) ์ด๋ฅธ ํ ๋ผ ํ ์์ด ์๊ธฐ ํ ๋ผ ํ ์์ ๋ณ๋๋ค.
๋ ๋ฌ ๋ค) ์ด๋ฅธ ํ ๋ผ ๋ ์์ด ๊ฐ๊ฐ ์๊ธฐ ํ ๋ผ ํ ์์ ๋ณ๋๋ค.
.. n๊ฐ์ ๋ค์ ํ ๋ผ๋ ์ด ๋ช ์์ด ์์๊น?
ํผ๋ณด๋์น ์์ด์ ์ ํ์
f(0) = 0, > ์ฒ์ : 0์.
f(1) = 1, > ์ฒซ์งธ ๋ฌ : (์๊ธฐํ ๋ผ) 1์
f(2) = f(1) + f(0)= 1 + 0 = 1 > ๋์งธ ๋ฌ : ์ด๋ฅธํ ๋ผ 1์
f(3) = f(2) + f(1) = 1 + 1 = 2 > ์ ์งธ ๋ฌ : ์ด๋ฅธํ ๋ผ 1์, (์๊ธฐํ ๋ผ) 1์ = 2์
f(4) = f(3) + f(2) = 2 + 1 = 3 > ๋ท์งธ ๋ฌ : ์ด๋ฅธํ ๋ผ 2์, (์๊ธฐํ ๋ผ) 1์ = 3์
f(5) = f(4) + f(3) = 3 + 2 = 5 > ๋ค์ฏ์งธ ๋ฌ : ์ด๋ฅธํ ๋ผ 3์, (์๊ธฐํ ๋ผ) 2์ = 5์
...
์ ๋ฆฌํ๋ฉด
f(0) = 0 > ์ฒ์ : 0์
f(1) = 1 > ์ฒซ์งธ ๋ฌ : (์๊ธฐํ ๋ผ) 1์
...
f(n) = f(n-1) + f(n-2) > n์งธ ๋ฌ = n-1๋ฒ์งธ ๋ฌ์ ํ ๋ผ ์ + n-2๋ฒ์งธ ๋ฌ์ ํ ๋ผ ์
์ฌ๊ท๋ก ํผ๋ณด๋์น ์์ด์ ๊ตฌํํ๊ธฐ
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ
var fibo = function (n) { // n๊ฐ๋ญ ํ ํ ๋ผ ์์ ์.
if (n == 0) { //n์ด 0์ด๋ฉด 0.
return 0;
} else if (n == 1) {
return 1;
} else {
return fibo(n - 1) + fibo(n - 2);
}
}
fibo(0); // 0
fibo(1); // 1
fibo(2); // 1
fibo(3); // 2
fibo(4); // 3
fibo(5); // 5
fibo(6); // 8
๊ทธ๋ฌ๋ ์ ์ฝ๋์ ์น๋ช
์ ๋ฌธ์ ๋..
: ๋งค๋ฒ ํจ์๋ฅผ ํธ์ถํด ๊ฐ์ ๊ณ์ฐ์ ๋ฐ๋ณตํ๋ค (์ด๋ฏธ ๊ณ์ฐํด์ ์๋ ๊ฐ์ธ๋ฐ๋).
( = ํจ์๋ฅผ ๋ถํ์ํ๊ฒ ๋๋ฌด ๋ง์ด ํธ์ถํ๋ค)
์? ์ปดํจํฐ๋ '์ด๋ฏธ ์๊ณ ์๋ ๊ฐ์ด๋ผ๋ ์ฌ์ค ์์ฒด๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์' ํ์ํ ๋๋ง๋ค ๋๊ฐ์ ๊ณ์ฐ์ ๋ ํ๋ ๊ฒ.
fibo(40); ๋ง ํด ๋ณด์๋ ๊ฒฐ๊ณผ ์ถ๋ ฅ์ด ์กฐ๊ธ์ฉ ๋๋ ค์ง์ ์ ์ ์๋ค.
(fibo(40)์ ์ํด ์ปดํจํฐ๋ ๋ช์ต ๋ฒ๋ ๋๊ฒ ๊ณ์ฐ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ)
์๋ฅผ ๋ค์ด fibo(10) ์ด๋ผ๊ณ ํด ๋ณด๋ฉด..
fibo(10) = fibo(9) + fibo(8)
1. fibo(9)๋ฅผ ๊ตฌํ๊ธฐ ์ํด fibo(9) = fibo(8) + fibo(7),
->fibo(8)์ ๊ตฌํ๊ธฐ ์ํด fibo(8) = fibo(7) + fibo(6)์ ๊ตฌํ๊ณ
->fibo(7)์ ๊ตฌํ๊ธฐ ์ํด fibo(7) = fibo(6) + fibo(5)๋ฅผ ๊ตฌํ๋ค.
๊ตฌํ๋ ๊ฐ์ ๋์ ํ๋ ๊ฒ ์๋ ๋งค๋ฒ ์๋ก ๊ณ์ฐ.
2. fibo(8)์ ๊ตฌํ๊ธฐ ์ํด fibo(8) = fibo(7) + fibo(6),
->fibo(7)์ ๊ตฌํ๊ธฐ ์ํด fibo(7) = fibo(6) + fibo(5)๋ฅผ ๊ตฌํ๋ค.
->fibo(6)์ ๊ตฌํ๊ธฐ ์ํด fibo(6) = fibo(5) + fibo(4)๋ฅผ ๊ตฌํ๋ค.
์ญ์ ๊ตฌํ๋ ๊ฐ์ ๋์ ํ๋ ๊ฒ ์๋ ๋งค๋ฒ ์๋ก ๊ณ์ฐ.
๋์ : ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ (์ต์ )
var arr =[0, 1];
function fibo_d(n) {
if(arr[n] == undefined) {
arr[n] = fibo_d(n - 1) + fibo_d(n - 2);
}
return arr[n];
}
์ด๋ฐ ๋ฐฉ๋ฒ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(๋๋ memoization๋ฉ๋ชจ์ด์ ์ด์
) ๊ธฐ๋ฒ์ด๋ผ๊ณ ํฉ๋๋ค.
-> ์ฝ๋ ์ค๋ช
์ ์๋ต. ์ง๊ธ์ ๊ทธ๋ฅ ์ด๋ฐ ๊ฐ๋
์ด ์๋ค๋ ๊ฒ๋ง ์๊ณ ๋์ด๊ฐ๊ธฐ. (์ด์ฐจํผ ์ง๊ธ ์์ค์์ ์ค๋ช
๋ถ๊ฐ๋ฅ..)
(๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํจ์ฌ ๋ ๋น ๋ฅด๊ฒ ์ถ๋ ฅํด ์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌ๋ฏธ์ด๋ค)