DevLog

TIL(20210720) - ์žฌ๊ท€(recursion) ๋ณธ๋ฌธ

๐Ÿค” TIL(Today I Learned)

TIL(20210720) - ์žฌ๊ท€(recursion)

Seungjae Lee 2021. 7. 21. 00:32

๐ŸŽ Today

- ์žฌ๊ท€(recursion)์˜ ์ดํ•ด, JavaScript์—์„œ ์žฌ๊ท€ ํ˜ธ์ถœ ํ•™์Šต

- ์žฌ๊ท€(recursion)์„ ์ด์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด

๐Ÿค” Learned

๋ฌธ์ œ๋ฅผ ์ชผ๊ฐœ์–ด ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ๋ฒ•

์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ, ๋™์ผํ•œ ๊ตฌ์กฐ์˜ ๋” ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ์œผ๋กœ์จ ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์žฌ๊ท€(recursion)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์žฌ๊ท€์˜ ๊ณผ์ •์„ arrSum์— ์ ์šฉํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๊ธฐ์กด์˜ ๋ฌธ์ œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋” ์ž‘์€ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

    arrSum([10, 3, 6, 2]) = 10 + arrSum([3, 6, 2]);

    [์ฝ”๋“œ] arrSum์— ์ ์šฉํ•  ๋ฌธ์ œ๋ฅผ ๋” ์ž‘๊ฒŒ ์ชผ๊ฐญ๋‹ˆ๋‹ค.

  2. ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ, ๋ฌธ์ œ๊ฐ€ ๋”๋Š” ์ž‘์•„์ง€์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋” ์ž‘์€ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

    arrSum([3, 6, 2]) = 3 + arrSum([6, 2]);
    arrSum([6, 2]) = 6 + arrSum([2]);
    arrSum([2]) = 2 + arrSum([]);

    [์ฝ”๋“œ] arrSum์— ์ ์šฉํ•  ๋ฌธ์ œ๋ฅผ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๊นŒ์ง€ ์ชผ๊ฐญ๋‹ˆ๋‹ค.

  3. ๋ฌธ์ œ๊ฐ€ ๊ฐ„๋‹จํ•ด์ ธ์„œ ๋ฐ”๋กœ ํ’€ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์•ž์„œ ์ƒ์„ฑํ•œ ๋ฌธ์ œ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

    arrSum([]) = 0; // <-- ๋ฌธ์ œ๊ฐ€ ๋”๋Š” ์ž‘์•„์ง€์ง€ ์•Š๋Š” ์ˆœ๊ฐ„
    // ๊ฐ€์žฅ ์ž‘์€ ๊ฒฝ์šฐ์˜ ํ•ด๊ฒฐ์ฑ…์„ ์ ์šฉํ•œ๋‹ค.
    arrSum([2]) = 2 + arrSum([]) = 2;
    arrSum([6, 2]) = 6 + arrSum([2]) = 6 + 2 = 8;
    arrSum([3, 6, 2]) = 3 + arrSum([6, 2]) = 3 + 8 = 11;
    arrSum([10, 3, 6, 2]) = 10 + arrSum([3, 6, 2]) = 10 + 11 = 21;

    [์ฝ”๋“œ] ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋ถ€ํ„ฐ arrSum์„ ์ ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’‰๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด, arrSum ์„ ๋ณด๋‹ค ์—„๋ฐ€ํ•˜๊ฒŒ(formally) ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

/*
 * 1. arr์ด ๋นˆ ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ = 0
 * 2. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ = arr[0] + arrSum(arr2)
 *   (arr2๋Š” arr์˜ ์ฒซ ์š”์†Œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ฐฐ์—ด)
 */
arrSum(arr);

[์ฝ”๋“œ] ํ•จ์ˆ˜ arrSum์˜ ์—„๋ฐ€ํ•œ ์ •์˜

๋งŒ์•ฝ ํ•จ์ˆ˜ arrSum ์„ JavaScript ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ (์ฝ”ํ”Œ๋ฆฟ ๊ณผ์ œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค), ํ•จ์ˆ˜ arrSum ์€ (์ธ์ž๊ฐ€ ๋นˆ ๋ฐฐ์—ด์ด ์•„๋‹Œ ๊ฒฝ์šฐ) ์‹คํ–‰๊ณผ์ • ์ค‘์— ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜ธ์ถœ ๋ฐฉ์‹์„ ์žฌ๊ท€ ํ˜ธ์ถœ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์žฌ๊ท€๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹์„๊นŒ?

์žฌ๊ท€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋งค์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. 1. ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ๋น„์Šทํ•œ ๊ตฌ์กฐ์˜ ๋” ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ 2. ์ค‘์ฒฉ๋œ ๋ฐ˜๋ณต๋ฌธ์ด ๋งŽ๊ฑฐ๋‚˜ ๋ฐ˜๋ณต๋ฌธ์˜ ์ค‘์ฒฉ ํšŸ์ˆ˜(number of loops)๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ

for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
        for (let k = 0; k < n; k++) {
            for (let l = 0; l < n; l++) {
                for (let m = 0; m < n; m++) {
                    for (let n = 0; n < n; n++) {
                        for (let o = 0; o < n; o++) {
                            for (let p = 0; p < n; p++) {
                                // do something
                                someFunc(i, j, k, l, m, n, o, p);
                           }
                        }
                    }
                }
            }
        }
    }
 }

๋ชจ๋“  ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋ณต๋ฌธ(while ๋ฌธ ๋˜๋Š” for ๋ฌธ)์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์žฌ๊ท€๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š”, ์žฌ๊ท€๋ฅผ ์ ์šฉํ•œ ์ฝ”๋“œ๊ฐ€ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. Self Guided Lesson์œผ๋กœ ์ฃผ์–ด์ง„ ํ•˜๋…ธ์ด์˜ ํƒ‘๊ณผ ์กฐํ•ฉ(combination) ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•œ ๊ฒฝ์šฐ์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๋กœ ๋น„๊ตํ•ด ๋ณด์„ธ์š”.

์ด ๋ฐ–์—๋„, ์žฌ๊ท€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋งŒ๋‚˜๊ฒŒ ๋  ๋‹ค์–‘ํ•œ ์Šคํ”„๋ฆฐํŠธ์™€ ๊ธฐ์—…์˜ ์ž…์‚ฌ ์‹œํ—˜(์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ ๋“ฑ)์ด๋‚˜ ์ง๋ฌด๋ฉด์ ‘์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์ดˆ๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ๋‹ค์ ธ๋‘๋Š” ๊ฒŒ ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋ชจ๋“  ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ ์—†์ด while / for loop์œผ๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ, ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ , ์ผ๋ถ€์˜ ๊ฒฝ์šฐ์—๋Š” ์ดํ•ดํ•˜๊ธฐ๋„ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด ์žฅ์ด ๋๋‚˜๊ณ  ๊ฒ€์ƒ‰ ๊ณผ์ œ๋กœ ์ฃผ์–ด์ง€๋Š” ํ•˜๋…ธ์ด์˜ ํƒ‘๊ณผ ์กฐํ•ฉ(combination) ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๋กœ ๋น„๊ตํ•ด ๋ณด์„ธ์š”.

์ด ๋ฐ–์—๋„ ์žฌ๊ท€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ํ•™์Šตํ•˜์‹œ๊ฒŒ ๋  ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ”„๋ฆฐํŠธ์—์„œ, ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์—…์˜ ์ž…์‚ฌ ์‹œํ—˜(์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ)์—์„œ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์ดˆ๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ๋‹ค์ง€์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์žฌ๊ท€์  ์‚ฌ๊ณ  ์—ฐ์Šตํ•˜๊ธฐ

์žฌ๊ท€๋Š” ์ž์ „๊ฑฐ๋ฅผ ํƒ€๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ž์ „๊ฑฐ ํƒ€๋Š” ๋ฒ•์„ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ํƒ€๋Š” ๊ฒƒ์„ ์˜†์—์„œ ์ง€์ผœ๋ณด๋ฉด ๊ฝค ์‰ฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ง‰์ƒ ๋‚ด๊ฐ€ ํƒ€๋ ค๊ณ  ํ•˜๋ฉด, ์ƒ๊ฐ๋ณด๋‹ค ์ž˜ ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ž์ „๊ฑฐ๋ฅผ ์ž˜ ํƒ€๋Š” ๋ฐฉ๋ฒ•์€ ๊ณ„์† ์‹œ๋„ํ•˜๊ณ  ์—ฐ์Šตํ•˜๋Š” ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. ์žฌ๊ท€ ์—ญ์‹œ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ž์—ฐ์Šค๋Ÿฌ์›Œ์งˆ ๋•Œ๊นŒ์ง€ ์—ฐ์Šตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ฝ˜ํ…์ธ ์—์„œ ์žฌ๊ท€์  ์‚ฌ๊ณ ๋ฅผ ๋”์šฑ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ด๋“œ๋ฅผ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ ์ฝ”ํ”Œ๋ฆฟ์˜ ์žฌ๊ท€ ๋ฌธ์ œ๋ฅผ ์ง€์†ํ•ด์„œ ํ’€๋‹ค ๋ณด๋ฉด, ์žฌ๊ท€์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํžˆ๊ณ  ์žฌ๊ท€๋ฅผ ๋”์šฑ๋” ์‰ฝ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’ ์ •์˜ํ•˜๊ธฐ

์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ’€๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ œ, ์ฆ‰ ๋„๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชฉํ‘œ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์žฌ๊ท€์ ์œผ๋กœ ์‚ฌ๊ณ ํ•˜๋Š” ๋ฐ์— ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ ๋ฌธ์ œ๋ฅผ ๊ฐ€์žฅ ์ถ”์ƒ์ ์œผ๋กœ ๋˜๋Š”, ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๊ฒŒ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ arrSum์˜ ๊ฒฝ์šฐ number ํƒ€์ž…์„ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๊ณ , number ํƒ€์ž…์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ข€ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œ๊ธฐํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • arrSum: [number] => number

2. ๋ฌธ์ œ๋ฅผ ์ชผ๊ฐœ๊ณ  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‚˜๋ˆ„๊ธฐ

์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ชผ๊ฐค ๊ฒƒ์ธ์ง€ ๊ณ ๋ฏผํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ชผ๊ฐค ๊ธฐ์ค€์„ ์ •ํ•˜๊ณ , ์ •ํ•œ ๊ธฐ์ค€์— ๋”ฐ๋ผ ๋ฌธ์ œ๋ฅผ ๋” ํฐ ๊ฒฝ์šฐ์™€ ์ž‘์€ ๊ฒฝ์šฐ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ, ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ด ๊ธฐ์ค€์„ ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ค‘์š”ํ•œ ๊ด€์ ์€ ์ž…๋ ฅ๊ฐ’์ด๋‚˜ ๋ฌธ์ œ์˜ ์ˆœ์„œ์™€ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ์ž…๋ ฅ๊ฐ’ ๋˜๋Š” ๋ฌธ์ œ ์ƒํ™ฉ์„ ํฌ๊ธฐ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜, ์ˆœ์„œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฌธ์ œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ตฌ๋ถ„๋œ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๋ฐฉ์‹์ด ์ˆœ์„œ๋‚˜ ํฌ๊ธฐ์— ๊ด€๊ณ„์—†์ด ๋ชจ๋‘ ๊ฐ™๋‹ค๋ฉด, ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ๊ตฌ๋ถ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜ arrSum ์˜ ๊ฒฝ์šฐ ์ž…๋ ฅ๊ฐ’์ธ ๋ฆฌ์ŠคํŠธ(๋ฐฐ์—ด)์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ, ๋” ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  arrSum([1, 2, 3, 4]) ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ arrSum([2, 3, 4]) ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋™์ผํ•˜๋ฏ€๋กœ, ์ด ๊ตฌ๋ถ„์€ ์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ผ, ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜ arrSum์€ ์ž…๋ ฅ๊ฐ’์ด ๋นˆ ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • arrSum: [number] => number
    arrSum([ ])
    arrSum([e1, e2, ... , en])

3. ๋‹จ์ˆœํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ

๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ๋กœ ๊ตฌ๋ถ„ํ•œ ๋‹ค์Œ์—๋Š”, ๊ฐ€์žฅ ํ•ด๊ฒฐํ•˜๊ธฐ ์‰ฌ์šด ๋ฌธ์ œ๋ถ€ํ„ฐ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์žฌ๊ท€์˜ ๊ธฐ์ดˆ(base case)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์žฌ๊ท€์˜ ๊ธฐ์ดˆ๋Š” ๋‚˜์ค‘์— ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, ์žฌ๊ท€์˜ ํƒˆ์ถœ ์กฐ๊ฑด(์žฌ๊ท€ ํ˜ธ์ถœ์ด ๋ฉˆ์ถ”๋Š” ์กฐ๊ฑด)์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜ arrSum ์„ ๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ๊ฐ’์ด ๋นˆ ๋ฐฐ์—ด์ผ ๊ฒฝ์šฐ์ด๊ณ , ์ด๋•Œ arrSum([]) ์˜ ๋ฆฌํ„ด๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค.
  • arrSum: [number] => number
    arrSum([ ]) = 0
    arrSum([e1, e2, ... , en])

4. ๋ณต์žกํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ

๋‚จ์•„์žˆ๋Š” ๋ณต์žกํ•œ ๊ฒฝ์šฐ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธธ์ด๊ฐ€ 1 ์ด์ƒ์ธ ๋ฐฐ์—ด์ด ํ•จ์ˆ˜ arrSum ์— ์ž…๋ ฅ๋œ ๊ฒฝ์šฐ, ๋งจ ์•ž์˜ ์š”์†Œ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋”ฐ๋กœ ๊ตฌํ•˜๊ณ (๋ฐฐ์—ด์˜ ๋งจ ์•ž์˜ ์š”์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์— head๋ผ๊ณ  ์ด๋ฆ„ ๋ถ™์ด๊ฒ ์Šต๋‹ˆ๋‹ค.), ๋‚˜๋จธ์ง€ ์š”์†Œ๋ฅผ ์ƒˆ๋กœ์šด ์ž…๋ ฅ๊ฐ’์œผ๋กœ ๊ฐ–๋Š” ๋ฌธ์ œ๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ , ์ด๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์–ป์€ ๊ฒฐ๊ณผ๋ฅผ head์— ๋”ํ•ฉ๋‹ˆ๋‹ค.
  • arrSum: [number] => number
    arrSum([ ]) = 0
    arrSum([e1, e2, ... , en]) = e1 + arrSum([e2, ..., en])
  • ๋ฐฐ์—ด์„ head์™€ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„(tail)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋งŒ ์•ˆ๋‹ค๋ฉด, ํ•จ์ˆ˜ arrSum์„ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ์ฝ”๋“œ ๊ตฌํ˜„ํ•˜๊ธฐ

function arrSum(arr) {
  //Base Case : ๋ฌธ์ œ๋ฅผ ๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ (์žฌ๊ท€์˜ ๊ธฐ์ดˆ)
  if (arr์˜ ๊ธธ์ด๊ฐ€ 0์ธ ๊ฒฝ์šฐ) {
    return 0;
  }
  /*
  * Recursive Case : ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ
  * ๋ฌธ์ œ๋ฅผ ๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
  * head: ๋ฐฐ์—ด์˜ ์ฒซ ์š”์†Œ
  * tail: ๋ฐฐ์—ด์˜ ์ฒซ ์š”์†Œ๋งŒ ์ œ๊ฑฐ๋œ ๋ฐฐ์—ด
  */
  return head + arrSum(tail);
}

์•„๋ž˜๋Š” ์ผ๋ฐ˜์ ์ธ ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค. ์žฌ๊ท€ ํ•จ์ˆ˜ ์—ฐ์Šต์— ํ™œ์šฉํ•˜์„ธ์š”.

function recursive(input1, input2, ...) {
  // Base Case : ๋ฌธ์ œ๋ฅผ ๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
  if (๋ฌธ์ œ๋ฅผ ๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ) {
    return ๋‹จ์ˆœํ•œ ๋ฌธ์ œ์˜ ํ•ด๋‹ต;
  }
  // recursive Case
  // ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ
  return ๋” ์ž‘์€ ๋ฌธ์ œ๋กœ ์ƒˆ๋กญ๊ฒŒ ์ •์˜๋œ ๋ฌธ์ œ
  // ์˜ˆ1. someValue + recursive(input1Changed, input2Changed, ...)
  // ์˜ˆ2. someValue * recursive(input1Changed, input2Changed, ...)
}

๐ŸŒˆ Tomorrow

- oop ๋ณต์Šต

- ํ† ์ด 1๋ฒˆ ๋‹ค์‹œ ๋ณด๊ธฐ

Comments