์žฌ๊ท€ recursion (JAVA)

ํšฝยท2024๋…„ 9์›” 6์ผ
0

algorithm&data-structure

๋ชฉ๋ก ๋ณด๊ธฐ
14/17

๐Ÿ“ ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ž€?

: ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
์ฆ‰, ํ•˜ํ–ฅ์‹ ๋ฐฉ์‹(top - down) ์ด๋‹ค.


1. ์žฌ๊ท€ ๊ตฌ์„ฑ

  • ๊ธฐ์ € ์กฐ๊ฑด(Base Case): ์žฌ๊ท€ ํ˜ธ์ถœ์„ ๋ฉˆ์ถ”๋Š” ์กฐ๊ฑด์ด๋‹ค.
  • ์žฌ๊ท€ ํ˜ธ์ถœ(Recursive Call): ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์ ์  ์ž‘๊ฒŒ ๋งŒ๋“ ๋‹ค.

2. ์žฅ๋‹จ์ 

(1) ์žฅ์ 

  • ์ง๊ด€์ ์ด๋‹ค -> ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ์ฆ๊ฐ€ํ•œ๋‹ค.
  • ๋ณ€์ˆ˜ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ํ•œ๋‹ค.

(2) ๋‹จ์ 

  • ์Šคํƒ ์˜ค๋ฒ„ ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. <- ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์ € ์กฐ๊ฑด (base case)๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ™•๋ฆฝํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
  • ์„ฑ๋Šฅ ์ €ํ•˜ํ•œ๋‹ค.

3. ์žฌ๊ท€ ์˜ˆ์‹œ : ํ”ผ๋ณด๋‚˜์น˜

public int factorial(int n) {
    if (n <= 1) return 1;  // ๊ธฐ์ € ์กฐ๊ฑด
    return n * factorial(n - 1);  // ์žฌ๊ท€ ํ˜ธ์ถœ
}

๊ธฐ์ € ์กฐ๊ฑด์ด ๋‚˜ํƒ€๋‚˜์•ผ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ๋ฉˆ์ถ˜๋‹ค.


4. ํ™œ์šฉ

  • ๋ถ„ํ•  ์ •๋ณต
  • ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋“ฑ ๋‹ค์–‘ํ•œ ๊ณณ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


5-1. ๊ผฌ๋ฆฌ ์žฌ๊ท€ Tail Recursion

!! JAVA์—์„œ๋Š” ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

: ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•  ๋•Œ, ๊ทธ ํ˜ธ์ถœ์ด ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ์ž‘์—…์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ์žฌ๊ท€์ด๋‹ค. ์ฆ‰, ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ํ›„ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.

// ์ผ๋ฐ˜์ ์ธ ์žฌ๊ท€ (๊ผฌ๋ฆฌ ์žฌ๊ท€๊ฐ€ ์•„๋‹˜)
public int factorial(int n) {
    if (n == 1) return 1;
    return n * factorial(n - 1);  // ๋งˆ์ง€๋ง‰์— ๊ณฑ์…ˆ ์—ฐ์‚ฐ์ด ์žˆ์–ด ๊ผฌ๋ฆฌ ์žฌ๊ท€๊ฐ€ ์•„๋‹˜
}

// ๊ผฌ๋ฆฌ ์žฌ๊ท€
public int factorialTail(int n, int acc) {
    if (n == 1) return acc;
    return factorialTail(n - 1, n * acc);  // ์žฌ๊ท€ ํ˜ธ์ถœ์ด ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ์ž‘์—…
}

5-2. ๊ผฌ๋ฆฌ ์žฌ๊ท€ ์ตœ์ ํ™” Tail Recursion Optimization

: ์ผ๋ถ€ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ, ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ํ˜ธ์ถœ์ด ๋‹ค์‹œ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ์ผ๋ จ์˜ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์Šคํƒ ๊ณต๊ฐ„์„ ํฌ๊ฒŒ ์ ˆ์•ฝํ•˜์—ฌ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

// ๊ผฌ๋ฆฌ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ํŒฉํ† ๋ฆฌ์–ผ
public int factorial(int n) {
    return factorialTail(n, 1);
}

// ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ผฌ๋ฆฌ ์žฌ๊ท€ ์ตœ์ ํ™” ์ ์šฉ
public int factorialIterative(int n) {
    int result = 1;
    while (n > 1) {
        result *= n;
        n--;
    }
    return result;
}




0๊ฐœ์˜ ๋Œ“๊ธ€