์ฌ๊ท (recursive)
ํฉํ ๋ฆฌ์ผ ๊ตฌํ๊ธฐ
package ์๋ฃ๊ตฌ์กฐ์
๋ฌธ.์ฌ๊ท;
public class Factorial {
static int facto(int x) { //์ฌ๊ท๋ก ๊ตฌํ
if(x > 1) {
return x * facto(x-1);
}
return 1;
}
static int facto2(int x) { // ์ผํญ์ฐ์ฐ์ + ์ฌ๊ท ๊ตฌํ
return (x > 1) ? x * facto(x-1) : 1;
}
public static void main(String[] args) {
System.out.println(facto2(5));
}
}
์ง์ ์ฌ๊ท์ ๊ฐ์ ์ฌ๊ท
- ์ง์ ์ฌ๊ท : A - A - A ํํ๋ก ์์ ๊ณผ ๋์ผํ ๋ฉ์๋๋ฅผ ํธ์ถํ๋๊ฒ
- ๊ฐ์ ์ฌ๊ท : A - B - C ํํ๋ก ๋ฉ์๋ A ๊ฐ B๋ฅผ ํธ์ถ, B๊ฐ C๋ฅผ ํธ์ถํ๋ ๊ฒ
์ ํด๋ฆฌ๋ ํธ์ ๋ฒ
- ๋์์ ์ต๋๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ
- ๋์๋ฅผ ์ง์ฌ๊ฐํ์ ๋๋ณ์ ๊ธธ์ด๋ผ๊ณ ์๊ฐํ๊ณ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์. ์ง์ฌ๊ฐํ์ ์ ์ฌ๊ฐํ์ผ๋ก ๋นํ์์ด ์ฑ์ด๋ค. ์ด๋ ๊ฒ ๋ง๋ค์ด์ง๋ ์ ์ฌ๊ฐํ๊ฐ์ด๋ฐ ๊ฐ์ฅ ๊ธด๋ณ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ค.
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณตํ์ฌ ์ต๋๊ณต์ฝ์๋ฅผ ๊ตฌํ๊ฒ ๋๋ค.
์ฆ,
- y=0 ์ผ๋ , ์ต๋๊ณต์ฝ์ : x
- y!=0 ์ผ๋, ์ต๋๊ณต์ฝ์ : gcd(y, x % y)
package ์๋ฃ๊ตฌ์กฐ์
๋ฌธ.์ฌ๊ท;
public class ์ ํด๋ฆฌ๋ํธ์ ๋ฒ {
static int gcd(int x, int y) {
if(y==0) {
return x;
}
return gcd(y, x % y);
}
public static void main(String[] args) {
int x = 31;
int y = 3;
System.out.println("์ต๋๊ณต์ฝ์ : " + gcd(x,y));
}
}
์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ๋ถ์
ํํฅ์ ๋ถ์
- top-down Analysis - ๊ฐ์ฅ ์์ชฝ์ ๋ฉ์๋๋ถํฐ ์๋๋ก ํ๋์ฉ ๋ถ์ํด ๋๊ฐ๋ ๋ฐฉ๋ฒ
- ๊ฐ์ ํธ์ถ์ด ์ฌ๋ฌ๋ฒ ์๋ ๊ฒฝ์ฐ, ํจ์จ์ด ๋จ์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ํฅ์ ๋ถ์
- bottom-up Analysis - ๊ฐ์ฅ ์๋์ชฝ๋ถํฐ ์์์ฌ๋ฆฌ๋ฉฐ ๋ถ์์ ์งํํ๋ ๋ฐฉ๋ฒ
์์ ์ฌ๊ท (genuinely) - ์๋์ ๊ฐ์ด ์ฌ๊ท ํธ์ถ์ ์ฌ๋ฌ๋ฒ ์คํํ๋ ๊ฒ.
public class Recur {
static void recur(int n) {
if(n > 0) {
recur(n-1);
System.out.println(n);
recur(n-2);
}
}
public static void main(String[] args) {
recur(4);
}
}
์์
- recur(3) ์คํ
- 4๋ฅผ ์ถ๋ ฅ
- recur(2) ์คํ
ํ๋ ธ์ด์ ํ
ํ๋
ธ์ด์ ํ์ ์์๋์ ์๋ฐ์ ์ต์์ ํ์๋ก ์ฎ๊ธฐ๊ธฐ์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋๋ฌด์ํค ๋ฐ๋ก๊ฐ๊ธฐ
ํ๋
ธ์ด์ํ ๊ฒ์
๋ฌธ์ ๋ฅผ ํ๊ธฐ์ํด์ ํฐ๋ฌธ์ ๋ฅผ ์์๋ฌธ์ ๋ก ๋๋์ด์ ํด๊ฒฐํ๋ ๋ฐฉ์์ ์ฌ์ฉํด์ผํ๋ค.
package ์๋ฃ๊ตฌ์กฐ์
๋ฌธ.์ฌ๊ท;
public class TowersOfHanoi {
static int count;
public static void move(int n, int x, int y) {
if(n > 1) {
move(n-1, x, 6-x-y); //6-x-y ๋ฅผ ํตํด ์ค๊ฐ๊ธฐ๋ฅ์ ์ฐพ์์์์.
}
System.out.printf("%d ํฌ๊ธฐ ์๋ฐ์ %d๊ธฐ๋ฅ์์ %d๊ธฐ๋ฅ์ผ๋ก ์ด๋ \n", n, x, y);
count ++;
if(n > 1) {
move(n-1, 6-x-y, y);
}
}
public static void main(String[] args) {
int n = 3;
count = 0;
move(n, 1, 3);
System.out.println("์ด๋ํ์ : " + count);
}
}
8ํธ ๋ฌธ์
์๋ก ๊ณต๊ฒฉํ์ฌ ์ก์์์๋๋ก 8X8 ์ฒด์คํ์ ๋์ผ์ธ์.
๊ท์น์ ์ธ์์ ๋ฌธ์ ์ ์ ๊ทผ์ ํด์ผํ๋๋ฐ 64์นธ์ ์ฒด์คํ์ 1๊ฐ์ ํธ์ ๋ฐฐ์นํ๋ ๊ฒฝ์ฐ์์๋ 64์ด๊ณ ๋ค์์ 63 ๋ค์์ 62... ์ด๋ฐ์์ผ๋ก ์กฐํฉ์ด ๋ง๋ค์ด์ง๋ฏ๋ก
64 x 63 x 62 x ... 57
์ด๋ผ๋ ์์ฒญ๋๊ฒ ํฐ ์ซ์์ ์กฐํฉ์ด ๋ง๋ค์ด์ง๊ฒ ๋๋ค.
๊ทธ๋์ 2๊ฐ์ง ๊ท์น์ ์ถ๊ฐํด๋ณด์.
- ๊ฐ ์ด์ ํธ์ 1๊ฐ๋ง ๋ฐฐ์นํ ์์๋ค.
- ๊ฐ ํ์ ํธ์ 1๊ฐ๋ง ๋ฐฐ์นํ ์์๋ค.
์ด๋ ๊ฒ ํ๋
ธ์ด์ํ์ด๋ 8ํธ๋ฌธ์ ์ฒ๋ผ ๋ฌธ์ ๋ฅผ ์๊ฒ ์ชผ๊ฐ์ ์ธ๋ถํ๋ ์์ ๋ฌธ์ ๋ฅผ ๊ฒฐํฉํ์ฌ ๋ฌธ์ ๋ฅผํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ถํ ์ ๋ณต๋ฒ(Divide and Conquer)
๋ผ๊ณ ํ๋ค. - ํต์ ๋ ฌ, ๋ณํฉ์ ๋ ฌ ๋ฑ
1,2 ๋ฒ ๊ท์น์ ๋ง์ง๋ง ๊ท์น์ ๋ํด๋ณด์.
ํ๊ณผ ์ด์ด ๊ฒน์น์ง ์๊ฒ ๊ตฌํํ์์ผ๋ฏ๋ก ๋ง์ง๋ง์ผ๋ก ๋๊ฐ์ ๋ฐฉํฅ์ ์๊ฐํ๋ค.
๋๊ฐ์ ๋ฐฉํฅ์ ์ค๋ฅธ์ชฝ์์์ ์ผ์ชฝ์๋, ์ผ์ชฝ์์์ ์ค๋ฅธ์ชฝ์๋๋ก ํฅํ๋ ๋๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด์ผํ๋ค.
๋๊ฐ์ ์ ๋ค์๊ณผ๊ฐ์ด 2๊ฐ์ง ๊ฒฝ์ฐ๋ก ์๊ฐ๋๋ค.
static boolean[] flagLTR = new boolean[15];
static boolean[] flagRTL = new boolean[15];
์ฝ๋
package ์๋ฃ๊ตฌ์กฐ์
๋ฌธ.์ฌ๊ท;
public class Queen8 {
static int[] pos = new int[8]; //๊ฐ์ด์ ์กด์ฌํ๋ ํธ์ ์์น
static boolean[] flag = new boolean[8]; //๊ฐํ์ ํธ์ ์ด๋ฏธ ๋ฐฐ์นํ๋์ง ํ์ธ
static boolean[] flagLTR = new boolean[15]; // \ ๋ฐฉํฅ ๋๊ฐ์ ์ผ๋ก ํธ์ ๋ฐฐ์นํ๋์ง ํ์ธ (Left To Right)
static boolean[] flagRTL = new boolean[15]; // / ๋ฐฉํฅ ๋๊ฐ์ ์ผ๋ก ํธ์ ๋ฐฐ์นํ๋์ง ํ์ธ (Right To Left)
static void print() {
for(int i=0; i<pos.length; i++) {
System.out.printf("%2d", pos[i]);
}
System.out.println();
}
static void set(int col) {
for(int row=0; row<pos.length; row++) {
if(flag[row] == false &&
flagLTR[row + col] == false &&
flagRTL[col - row + 7] == false ) {
pos[col] = row;
if(col == 7) {
print();
}else {
flag[row] = flagLTR[col + row] = flagRTL[col - row + 7] = true;
set(col+1);
flag[row] = flagLTR[col + row] = flagRTL[col - row + 7] = false;
}
}
}
}
public static void main(String[] args) {
set(0);
}
}