Skip to content

Latest commit

ย 

History

History
130 lines (90 loc) ยท 3.9 KB

Recursive.md

File metadata and controls

130 lines (90 loc) ยท 3.9 KB

์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Recursive Algorithm)

written by sohyeon, hyemin ๐Ÿ’ก


1. ์žฌ๊ท€๋ž€?

์žฌ๊ท€๋Š” ์ž์‹ ์„ ์ •์˜ํ•  ๋•Œ ์ž๊ธฐ ์ž์‹ ์„ ์žฌ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค.

์–ด๋–ค ์‚ฌ๊ฑด์ด ์ž๊ธฐ ์ž์‹ ์„ ํฌํ•จํ•˜๊ณ  ๋‹ค์‹œ ์ž๊ธฐ ์ž์‹ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋  ๋•Œ ์žฌ๊ท€์ (recursive)์ด๋ผ๊ณ  ํ•œ๋‹ค.

์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์•Œ๋งž์€ ๊ฒฝ์šฐ๋Š” 'ํ’€์–ด์•ผ ํ•  ๋ฌธ์ œ', '๊ณ„์‚ฐํ•  ๋ฉ”์„œ๋“œ', '์ฒ˜๋ฆฌํ•  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ'๊ฐ€ ์žฌ๊ท€๋กœ ์ •์˜๋˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

2. ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ™œ์šฉ

1) ํŒฉํ† ๋ฆฌ์–ผ

์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ต์ˆ™ํ•œ ์˜ˆ์‹œ๋Š” ํŒฉํ† ๋ฆฌ์–ผ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.

1. 0!=1
2. n>0์ด๋ฉด, n! = n x (n-1)!

์˜ˆ์ œ ์ฝ”๋“œ

class Factorial{
    static int factorial(int n){
        if(n>0)
            return n*factorial(n-1);
        else
            return 1;
    }
}

2) ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•

๋‘ ์ •์ˆ˜์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

22์™€ 8์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ • ์˜ˆ์‹œ

  1. ๋‘ ์ •์ˆ˜๋ฅผ ๋‘ ๋ณ€์˜ ๊ธธ์ด๋กœ ํ•˜๋Š” ์ง์‚ฌ๊ฐํ˜•์„ ๋งŒ๋“ ๋‹ค.
  2. ์ง์‚ฌ๊ฐํ˜•์„ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ์™„์ „ํžˆ ์ฑ„์šด๋‹ค.
  3. ์ •์‚ฌ๊ฐํ˜•๋งŒ์œผ๋กœ ์ฑ„์›Œ์ง€์ง€ ์•Š์„ ๋•Œ, ๋‚จ์€ ์ง์‚ฌ๊ฐํ˜•์— ๊ฐ™์€ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
  4. ์ •์‚ฌ๊ฐํ˜•๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์„ ๋•Œ์˜ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜์ด๋‹ค.

ํฐ ๊ฐ’์„ ์ž‘์€ ๊ฐ’์œผ๋กœ ๋‚˜๋ˆŒ ๋•Œ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š” ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜์ด๋‹ค.
๋‚˜๋ˆ„์–ด์ง€์ง€ ์•Š์œผ๋ฉด ์ž‘์€๊ฐ’์— ๋Œ€ํ•ด ๋‚˜๋ˆ„์–ด ๋–จ์–ด์งˆ๋•Œ๊นŒ์ง€ ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋‘ ์ •์ˆ˜ x, y์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ -> gcd(x, y)

x = az
y = bz
z = gcd(x,y)

y๊ฐ€ 0์ด๋ฉด x์ด๊ณ  y๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด gcd(y, x%y)

์˜ˆ์ œ ์ฝ”๋“œ

class EuclidGCD{
    static int gcd(int x, int y){
        if(y==0)
            return 0;
        else
            return gcd(y, x%y);
    }
}

3) ํ•˜๋…ธ์ด์˜ ํƒ‘

ํ•˜๋…ธ์ดํƒ‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

์ž‘์€ ์›๋ฐ˜์ด ์œ„, ํฐ ์›๋ฐ˜์ด ์•„๋ž˜์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์›๋ฐ˜์„ 3๊ฐœ์˜ ๊ธฐ๋‘ฅ ์‚ฌ์ด์—์„œ ์˜ฎ๊ธฐ๋Š” ๋ฌธ์ œ์ด๋‹ค.
๋ชจ๋“  ์›๋ฐ˜์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๊ณ  ๋ชจ๋“  ์›๋ฐ˜์ด ์ด ๊ทœ์น™์— ๋งž๊ฒŒ ์ฒซ ๋ฒˆ์งธ ๊ธฐ๋‘ฅ์— ์Œ“์—ฌ์žˆ๋‹ค.
๋ชจ๋“  ์›๋ฐ˜์„ ์„ธ ๋ฒˆ์งธ ๊ธฐ๋‘ฅ์œผ๋กœ ์ตœ์†Œ์˜ ํšŸ์ˆ˜๋กœ ์˜ฎ๊ธด๋‹ค.
์›๋ฐ˜์€ 1๊ฐœ์”ฉ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

๋™์ž‘ ์›๋ฆฌ

์›๋ฐ˜์ด n๊ฐœ ์กด์žฌํ•˜๊ณ  ๊ธฐ๋‘ฅ 3๊ฐœ๋ฅผ ๊ฐ๊ฐ ์‹œ์ž‘ ๊ธฐ๋‘ฅ, ์ค‘๊ฐ„ ๊ธฐ๋‘ฅ, ๋ชฉํ‘œ ๊ธฐ๋‘ฅ์ด๋ผ๊ณ  ํ•  ๋•Œ ๊ฐ€์žฅ ํฐ ์›๋ฐ˜์„ ๋ชฉํ‘œ ๊ธฐ๋‘ฅ์œผ๋กœ ์ตœ์†Œ์˜ ์ด๋™ํšŸ์ˆ˜๋กœ ์›€์ง์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ๊ฐ€์žฅ ํฐ ์›๋ฐ˜์„ ์ œ์™ธํ•œ n-1๊ฐœ์˜ ์›๋ฐ˜ ๊ทธ๋ฃน์„ ์ค‘๊ฐ„ ๊ธฐ๋‘ฅ์œผ๋กœ ์ด๋™์‹œ์ผœ์•ผ ํ•œ๋‹ค.

์ด ๊ณผ์ •์„ ํฌ๊ฒŒ 3๋‹จ๊ณ„๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  1. ๊ทธ๋ฃน์„ ์ค‘๊ฐ„ ๊ธฐ๋‘ฅ์œผ๋กœ ์ด๋™
  2. ๊ฐ€์žฅ ํฐ ์›๋ฐ˜์„ ๋ชฉํ‘œ ๊ธฐ๋‘ฅ์œผ๋กœ ์ด๋™
  3. ๊ทธ๋ฃน์„ ๋ชฉํ‘œ ๊ธฐ๋‘ฅ์œผ๋กœ ์ด๋™

์˜ˆ์ œ ์ฝ”๋“œ

  • move(no) : ์ด๋™ ๋ฉ”์„œ๋“œ, ๋งค๊ฐœ๋ณ€์ˆ˜ no๋Š” ์˜ฎ๊ฒจ์•ผ ํ•  ์›๋ฐ˜์˜ ๊ฐœ์ˆ˜

  • x : ์‹œ์ž‘ ๊ธฐ๋‘ฅ์˜ ๋ฒˆํ˜ธ

  • y : ๋ชฉํ‘œ ๊ธฐ๋‘ฅ์˜ ๋ฒˆํ˜ธ

    ๊ธฐ๋‘ฅ ๋ฒˆํ˜ธ๋ฅผ 1, 2, 3์œผ๋กœ ๋‚˜ํƒ€๋ƒ„, ๊ธฐ๋‘ฅ ๋ฒˆํ˜ธ์˜ ์˜ ํ•ฉ์ด 6์ด๋ฏ€๋กœ
    ์‹œ์ž‘ ๊ธฐ๋‘ฅ๊ณผ ๋ชฉํ‘œ ๊ธฐ๋‘ฅ์ด ๋ฌด์—‡์ด๋˜ ์ค‘๊ฐ„๊ธฐ๋‘ฅ์€ 6-x-y๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

import java.util.Scanner;

class Hanoi {
	// no๊ฐœ์˜ ์›๋ฐ˜์„ x๋ฒˆ ๊ธฐ๋‘ฅ์—์„œ y๋ฒˆ ๊ธฐ๋‘ฅ์œผ๋กœ ์˜ฎ๊น€
	static void move(int no, int x, int y) {
		if (no > 1)
			move(no - 1, x, 6 - x - y);

		System.out.println("์›๋ฐ˜[" + no + "]์„ " + x + "๊ธฐ๋‘ฅ์—์„œ " + y + "๊ธฐ๋‘ฅ์œผ๋กœ ์˜ฎ๊น€");

		if (no > 1)
			move(no - 1, 6 - x - y, y);
	}

	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);

		System.out.println("ํ•˜๋…ธ์ด์˜ ํƒ‘");
		System.out.print("์›๋ฐ˜ ๊ฐœ์ˆ˜๏ผš");
		int n = stdIn.nextInt();

		move(n, 1, 3);	// 1๋ฒˆ ๊ธฐ๋‘ฅ์˜ n๊ฐœ๋ฅผ 3๋ฒˆ ๊ธฐ๋‘ฅ์œผ๋กœ ์˜ฎ๊น€
	}
}