ํด๋น ์๋ฆฌ์ฆ๋ ์ ๊ฐ ์ฑ (์ฝ๊ฒ ๋ฐฐ์ฐ๋ ์๋ฃ๊ตฌ์กฐ with ์๋ฐ)์ ์ฝ๊ณ ํด๋น ๋ด์ฉ์ ์ ๋ฆฌํ๊ธฐ ์ํ์ฌ ์์ฑ๋์์ต๋๋ค.
์ด๋ ต๋ค๊ณ ๋๊ปด์ง๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ต๋ํ ์ฝ๊ฒ ์ค๋ช ํ๊ณ ์ ํ์ด์ฐ๋ ์ ์ฐธ์กฐํด์ฃผ์๊ณ ,
๊ฐ์ด ์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ์ ๋ํด ๊ณต๋ถํ๋ ์๊ฐ์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
์๋ฃ๊ตฌ์กฐ์ ์ฌ๊ท
์ฌ๊ท?
์ฌ๊ท๋ ์ฑ๊ฒฉ์ ๊ฐ๊ณ ํฌ๊ธฐ๋ง ์์ ๋๋ฅผ ์ฐพ์ ํฐ ๋์ ์์ ๋๊ฐ ์ฐ๊ฒฐ๋ ๊ด๊ณ๋ฅผ ๋๋ฌ๋ด๋ ๊ฒ ์ ๋๋ค.
๋จ์ด๊ฐ ์์ํ์ฌ ๋ฌด์จ ์๋ฏธ์ธ์ง ์ ์๋ฟ์ง ์์ ์ ์๋๋ฐ์. (์ ๊ฐ ๊ทธ๋ฌ์ต๋๋ค.)
๊ฐ์ฅ ๊ฐ๋จํ ์์ธ ํฉํ ๋ฆฌ์ผ(!)๋ก ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
ํฉํ ๋ฆฌ์ผ์ 1๋ถํฐ n๊น์ง ๊ณฑํ๋ ๊ฒ์ผ๋ก n! = 1 * 2 * 3 * ... * (n - 1) * n ์ ๋๋ค.
์ฌ๊ธฐ์ ๋งจ ๋์ ์๋ n์ ์ ์ธํ๋ฉด 1 * 2 * 3 * ... * (n - 1), (n - 1)! ์ ๋๋ค.
๋ค์ ์ ๋ฆฌํ๋ฉด n! = n * (n - 1)! ์ ๋๋ค. ํน์ ๋ญ๊ฐ ๋๊ปด์ง์๋ ๊ฒ ์๋์?
์ด์ฒ๋ผ ํฌ๊ธฐ๊ฐ n์ธ ํฉํ ๋ฆฌ์ผ ํฌ๊ธฐ๊ฐ n - 1์ธ ํฉํ ๋ฆฌ์ผ์ ํฌํจํ๊ณ ์์ต๋๋ค. ์ด์ฒ๋ผ ์ด๋ค ๋ฌธ์ ๋ ํจ์ ๋ฑ์ด ์์ ๊ณผ ์ฑ๊ฒฉ์ด ๋๊ฐ์ง๋ง ํฌ๊ธฐ๊ฐ ๋ ์์ ๋ฌธ์ ๋ฅผ ํ๋ ์ด์ ํฌํจํ๊ณ ์์ ๋ '์ฌ๊ท์ ๊ตฌ์กฐ'๋ฅผ ๊ฐ๊ณ ์๋ค๊ณ ๋งํฉ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ์ฌ๊ท๋ฅผ ํจ์ ๋ด๋ถ์์ ์์ ์ ํธ์ถํ๋ ์๊ธฐ ํธ์ถ ๊ธฐ๋ฅ์ด๋ผ๊ณ ๋ ํฉ๋๋ค.
'์ฌ๊ท'์ ์๋ฏธ๊ฐ ์ง๊ด์ ์ผ๋ก ์ ์๋ฟ์ง ์๊ธฐ ๋๋ฌธ์ '์๊ธฐ ํธ์ถ'์ด๋ผ๋ ๋ง๊ณผ ํผ์ฉํ์ฌ ์ฐ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฌ๊ท ๊ตฌ์กฐ์ ์1) ํฉํ ๋ฆฌ์ผ
์์ ์ค๋ช ๋๋ ธ๋ ํฉํ ๋ฆฌ์ผ์ ์๋ฐ ์ฝ๋๋ก ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
public class Main {
public static void main(String[] args) {
System.out.println("3! = " + factorial(3));
}
public static int factorial(int n) {
if(n == 1) {
return 1;
} else return n * factorial(n-1);
}
}
์ด๋ ๊ฒ ์ฌ๊ทํจ์๋ ํจ์๊ฐ ์๊ธฐ ์์ ์ ํธ์ถํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
์ฆ, ํจ์๊ฐ ์ํ๋๋ ๋์ค์ ์๊ธฐ ์์ ์ ๋ค์ ํธ์ถํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์์ธ๋ฐ์.
์ด๋ ๊ฒ ์๊ธฐ ์์ ์ ํธ์ถํ๋ฉด์ ํจ์๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถ๋๋ ๊ฒ์ '์ฌ๊ทํธ์ถ(์๊ธฐ ํธ์ถ)' ์ด๋ผ๊ณ ํฉ๋๋ค.
ํฉํ ๋ฆฌ์ผ ๊ฐ์ด ๊ฐ๋จํ ๋ฌธ์ ์ ๊ฒฝ์ฐ์๋ ์ ๋ ฅ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ for๋ฌธ๊ณผ ์ฌ๊ทํจ์์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ํฌ์ง ์์ง๋ง, ์ด์ง ํ์๊ณผ ๊ฐ์ ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ ๊ตฌํ์ด ๋ ๋น ๋ฆ ๋๋ค.
- ์ด์ง ํ์ : ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ํน์ ๊ฐ์ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
๋ฐฐ์ด์ ์ค๊ฐ๊ฐ๊ณผ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ์ฌ ํ์ ๋ฒ์๋ฅผ ๋ฐ์ผ๋ก ์ค์ฌ๊ฐ๋ฉฐ ๊ฐ์ ์ฐพ์. - ๋ถํ ์ ๋ณต : ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ถ๋ถ์ผ๋ก ๋๋์ด ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ
ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋ถํ ํ ํ, ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ๊ฐ๊ฐ ํด๊ฒฐํ๊ณ , ๊ฐ ๋ถ๋ถ ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฒฐํฉํ์ฌ ์ ์ฒด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ(๋ณํฉ ์ ๋ ฌ, ํต ์ ๋ ฌ, ์ด์ง ํ์ ๋ฑ)
์ฌ๊ท ๊ตฌ์กฐ์ ์2) ํผ๋ณด๋์น ์์ด
ํผ๋ณด๋์น ์์ด์ ์ด์ ๋ ํญ์ ํฉ์ด ๋ค์ ํญ์ด ๋๋ ์์ด ์ ๋๋ค.
์ฆ, 0๊ณผ 1๋ถํฐ ์์ํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๋์ด๋ฉ๋๋ค.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
์ด ์์ด์ ์ฌ๊ท ํจ์๋ก ๊ตฌํํด๋ณผ๊น์?
public static int fibonacci(int n) {
if (n == 0) { // ์ข
๋ฃ ์กฐ๊ฑด 1
return 0;
} else if (n == 1) { // ์ข
๋ฃ ์กฐ๊ฑด 2
return 1;
} else { // ์ฌ๊ท ํธ์ถ
return fibonacci(n-1) + fibonacci(n-2);
}
}
์ ์ฝ๋์์ fibonacci()
๋ n๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๋ฐํํฉ๋๋ค.
n์ด 0์ด๋ 1์ผ ๋๋ ๊ฐ๊ฐ 0, 1์ ๋ฐํํ๋ฉฐ, ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ ์ด์ ๋ ํญ์ ํฉ์ ๊ณ์ฐํ๊ธฐ ์ํด ์๊ธฐ ์์ ์ ๋ ๋ฒ ํธ์ถํ์ฌ ์ฌ๊ท์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด ์์๋ค์ํผ ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ณตํด์ ํธ์ถํ๋ค๊ฐ ์ธ์ ๊ฐ ๋๋์ผ ํ๋๋ฐ ์ด๋ฅผ ์ํ ๊ฒฝ๊ณ ์กฐ๊ฑด์ ํญ์ ๊ฐ๊ณ ์์ด์ผ ํฉ๋๋ค.
ํฉํ ๋ฆฌ์ผ ํจ์๋ if(n == 1)
์ด ๊ฒฝ๊ณ ์กฐ๊ฑด์ด๊ณ , ํผ๋ณด๋์น ์์ด์ if(n == 0)
๊ณผ if(n == 1)
์
๋๋ค.
์ ์ํ ์
์์ fibonacci()
๋ฅผ ์๋ก ๋ค์ด ์ค๋ช
ํ์๋ฉด.. ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ตฌํํ๊ณ ํฐ ๊ฐ์ ๊ตฌํ๋ ค๊ณ ํ๋ฉด ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์๋ฉ๋๋ค.
์๋งfibonacci(100)
์ ๊ณ์ฐํ๋ ค๋ฉด ํ์ ๊ธฐ๋ค๋ ค๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ ๊ฒ์
๋๋ค.
๊ทธ ์ด์ ๋ ๋ญ๊น์?
๋ฐ๋ก ์ฌ๊ทํจ์์ ํธ์ถ ํ์๊ฐ ์ ๋ ฅ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ง์์ ์ผ๋ก ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ ์ ๋๋ค.
n
๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด์๋ ์ฌ๊ท ํธ์ถ์ด 2^(n-1)๋ฒ์ด ์ด๋ฃจ์ด์ง๋๋ค. ๋ฐ๋ผ์, ์
๋ ฅ ํฌ๊ธฐ๊ฐ ์ปค์ง ์๋ก ์ฌ๊ทํจ์์ ํธ์ถ ํ์๋ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ์ง์ํจ์์ ์ธ ์ฆ๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋นํจ์จ์ ์ด๋ฉฐ, ์ ๋ ฅ ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก ์คํ์๊ฐ์ด ๊ธ๊ฒฉํ ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ ์๊ณ ๋ฆฌ์ฆ์ ์ค๊ณํ ๋๋ ๊ฐ๋ฅํ ์ง์ ํจ์์ ์ธ ํธ์ถ ํ์๋ฅผ ์ต์ํํด์ผ ํฉ๋๋ค.
๊ฐ์ ๋ฐฉ์(?)
ํด๋น ์ฝ๋๊ฐ ๋นํจ์จ์ ์ธ ๊ฑธ ์์์ผ๋ฉด ๊ฐ์ ์ฝ๋๋ ์์๋ด์ผ๊ฒ ์ฃ !
public static int fibonacci(int n) {
if (n < 2) {
return n;
}
int[] fib = new int[n+1];
fib[0] = 0;
fib[1] = 1;
for (int i = 2; i <= n; i++) {
fib[i] = fib[i-1] + fib[i-2];
}
return fib[n];
}
์ด ์ฝ๋์์๋ fib[]
๋ฅผ ์ด์ฉํ์ฌ ์ค๋ณต๋๋ ๊ณ์ฐ์ ์ต์ํ ํ์์ต๋๋ค.
- ์
๋ ฅ ๊ฐ
n
์ ๋ฐ๋ผfib[]
์ ์์ฑํ๊ณ , ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ๊ฐ๊ณผ ๋ ๋ฒ์งธ ๊ฐ์ ๊ฐ๊ฐ 0๊ณผ 1์ ์ ์ฅํฉ๋๋ค. - 2 ๋ถํฐ n ๊น์ง ๋ฐ๋ณตํ๋ฉด์, ์ด์ ๋ ๊ฐ์ ๊ฐ์ ๋ํ ๊ฐ์ ํ์ฌ์ ๊ฐ์ผ๋ก ์ ์ฅํฉ๋๋ค.
fib[n]
๊ฐ์ ๋ฐํํ์ฌ ํผ๋ณด๋์น ์์ด์n
๋ฒ์งธ ๊ฐ์ ๊ณ์ฐ ํฉ๋๋ค.
์ด ์ฝ๋๋ ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ ์ ํ์ ์ธ ์คํ ์๊ฐ์ ๊ฐ์ง๋ฏ๋ก ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ ๋๋ค.
์๊น ์ฝ๋๋ก๋ fibonacci(100)
์ ์คํํ๋ฉด ํ์ ๊ฑธ๋ ค๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ชป๋ดค๋ค๋ฉด ์ด ์ฝ๋๋ก๋ ์ฒ๋ง ๋ถ์ 1์ด๋ ๊ฑธ๋ฆฌ์ง ์์ต๋๋ค.
'๐ Study > ์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ] Chapter 01. ์๋ฃ๊ตฌ์กฐ๋? (0) | 2023.03.18 |
---|