October 05, 2020
๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ํ ์ดํด๋ฅผ ํ๋ ค๋ฉด ์ฌ๊ท๋ ๋ณต์ก์ฑ ๋ฑ์ ์ดํดํด์ผ ํ๋ค๊ณ ํ๋ค. ์ค๊ฐ์ค๊ฐ ์ฌ๊ท์ ์ผ๋ก ์ฌ๊ณ ํ๊ธฐ, ์๊ฒ ์ชผ๊ฐ์ด ์ฌ๊ณ ํ๋ค ๋ผ๋๊ฒ ๋ฌด์์ ์๋ฏธํ๋ ๊ฑธ๊น?
๋ค๋ฅด๊ฒ ๊ทธ๋ฆฌ๊ณ ๋ค์ํ๊ฒ ์๊ฐํ๋ ๋ฅ๋ ฅ์ ๊ธฐ๋ฅด๊ธฐ ์ํด์ ๋ฐฐ์ฐ๋ ๊ฒ์ด๋ผ ํ๋ค.
์ด๋ฐ ๋ฌธ์ ๊ฐ ์ฃผ์ด์ก๋ค๊ณ ํ์.
๋ฌธ์ : ์์ฐ์์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ๋ฆฌ์คํธ์ ํฉ์ ๋ฆฌํดํ๋ ํจ์ โarrSumโ ์ ์์ฑํ์ธ์.
๊ทธ๋ผ ๋ณดํต ์ฌ๊ธฐ์ ๊ทธ๋์ ํ์ตํ ๋๋ก ์ด๊ธฐ๊ฐ๊ณผ ๋ฐ๋ณต๋ฌธ์ ์ ์ฉํ ํจ์๋ฅผ ๋ง๋ ๋ค.
function arrSum(...nums) {
let sum = 0 // 1. ๋ณด์กฐ ๋ณ์ sum ์ 0 ์ผ๋ก ์ด๊ธฐํ ํ๋ค.
for (let i = 0; i < nums.length; i++) {
sum = sum + nums[i] // 2. ์์ฐจ์ ์ผ๋ก ๋ฆฌ์คํธ์ ๊ตฌ์ฑ์์์ ์ ๊ทผํ๋ฉด์ sum ์ ๋ํ๋ค.
}
return sum
}
์๋ก ์์ฐ์์ ๋ฆฌ์คํธ [10, 3, 6, 2] ์ ํฉ์ ๊ตฌํ๋ค๊ณ ๊ฐ์ ํ๋ฉด,
arrSum([10, 3, 6, 2]) = 10 + arrSum([3, 6, 2])
arrSum([3, 6, 2]) = 3 + arrSum([6, 2])
arrSum([6, 2]) = 6 + arrSum([2])
arrSum([2]) = 2 + arrSum([])
arrSum([]) = 0
์ด์ฒ๋ผ ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋, ๊ตฌ์กฐ๋ ๋์ผํ์ง๋ง ๋ ์์ ๊ฒฝ์ฐ๋ฅผ ํด๊ฒฐํจ์ผ๋ก์จ ๊ทธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ฌ๊ท (recursion) ๋ผ๊ณ ํ๋ค.
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 ์ ์ธ์๊ฐ ๋น ๋ฐฐ์ด์ด ๋ค์ด์ค๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ฉด ์คํ๊ณผ์ ์ค์ ์๊ธฐ ์์ ์ ํธ์ถํ๊ธฐ๋ ํ๋ค. ์ด๋ฌํ ํธ์ถ ๋ฐฉ์์ ์ฌ๊ท ํธ์ถ์ด๋ผ๊ณ ํ๋ค.
์ฌ์ค ๋ชจ๋ ์ฌ๊ท ํจ์๋ ์ฌ๊ทํธ์ถ ์์ด while / for loop ์ผ๋ก ํํ์ด ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ์ฌ๊ท๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ, ์ฌ๊ท๋ฅผ ์ฌ์ฉํ ์ฝ๋๊ฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋์ฑ ๊ฐ๊ฒฐํ๊ณ , ์ผ๋ถ์ ๊ฒฝ์ฐ์๋ ์ดํดํ๊ธฐ๋ ์ฝ๋ค๊ณ ํ๋ค.
์ฌ๊ทํจ์๋ฅผ ํตํด ์ด๋ค ๋ฌธ์ ๋ฅผ ํ๊ณ ์ ํ๋์ง, ๋ฌธ์ ๋ฅผ ๊ฐ์ฅ ์ถ์์ ์ผ๋ก, ๋๋ ๊ฐ์ฅ ๋จ์ํ๊ฒ ์ ๋ฆฌํ๋ค.
arrSum: [number] => number
arrSum? ๊ทธ๊ฑฐ number ํ์ ์ ์์๋ก ๊ฐ๋ ๋ฐฐ์ด์ ๋ฐ์์ number ๋ฅผ ๋ฆฌํดํ๋๊ฑฐ?
์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ์ชผ๊ฐค ๊ฒ์ธ์ง ๊ณ ๋ฏผํด ๋ณด๊ธฐ. ์ด๋ค ๊ธฐ์ค์ (์ผ๋ฐ์ ์ผ๋ก ์ ๋ ฅ๊ฐ) ์ ํ๊ณ ๊ธฐ์ค์ ๋ฐ๋ผ ๋ฌธ์ ๋ฅผ ๋ ํฐ ๊ฒฝ์ฐ์ ์์ ๊ฒฝ์ฐ๋ก ๊ตฌ๋ถํ ์ ์๋์ง ๊ฒํ ํด ๋ณธ๋ค.
๊ฐ๋ น ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ ์ ๋ ฅ๊ฐ์ด ๋น ๋ฐฐ์ด์ผ ๋ ํน์ ๊ทธ๋ ์ง ์์ ๋๋ก ๊ตฌ๋ถํ๋ ๊ฒ์ฒ๋ผ ๋ง์ด๋ค.
๋ฌธ์ ๋ฅผ ์ชผ๊ฐค ๋ ์ค์ํ ๊ด์ ์ ์์, ๊ทธ๋ฆฌ๊ณ ํฌ๊ธฐ ์ด๋ค.
2-1. ์ฃผ์ด์ง ์ ๋ ฅ๊ฐ ๋๋ ๋ฌธ์ ์ํฉ์ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ ์ ์๊ฑฐ๋,
2-2. ์์๋ฅผ ๋ช ํํ๊ฒ ์ ํ ์ ์๋์ง
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒ ๊ตฌ๋ถ๋์ด์ง ๋ฌธ์ ๋ค์ ํธ๋ ๋ฐฉ์์ด ๊ฐ๋ค๋ฉด ๋ฌธ์ ๋ฅผ ์ ๋๋ก ๊ตฌ๋ถํ ๊ฒ์ด๋ค.
๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๊ฒฝ์ฐ๋ก ๊ตฌ๋ถํ ๋ค์์๋ ์ฌ์ด ๋ฌธ์ ๋ถํฐ ํด๊ฒฐํ๋ค. ์ด๋ฅผ ์ฌ๊ท์ ๊ธฐ์ด (base case) ๋ผ ํ๋ค. ์ฌ๊ท์ ๊ธฐ์ด๋ ๋์ค์ ์ฌ๊ทํจ์ ๊ตฌํ ์ ์ฌ๊ท์ ํ์ถ ์กฐ๊ฑด (์ฌ๊ท ํธ์ถ์ด ๋ฉ์ถ๋ ์กฐ๊ฑด) ์ ๊ตฌ์ฑํ๊ฒ ๋๋ค.
arrSum ์ ๋ ์ด์ ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ๋ ์
๋ ฅ๊ฐ์ด ๋น ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ์ด๊ณ , ์ด ๋ arrSum ์ 0 ์ด๋ค.
์์ ์๋ก arrSum ์ด ๊ธธ์ด๊ฐ 1์ด์์ธ ๋ฐฐ์ด์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ๊ฒฝ์ฐ, ๋งจ ์์ ์์๋ฅผ ๋ฐ๋ก ๊ตฌํ๊ณ ๋๋จธ์ง ์์๋ฅผ ์๋ก์ด ์ ๋ ฅ๊ฐ์ผ๋ก ๊ฐ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ฌ ์ป์ ๊ฒฐ๊ณผ๋ฅผ head ์ ๋ํ๋ค.
arrSum: [number] => number
arrSum([]) = 0
arrSum([e1, e2, ..., en]) = e1 + arrSum([e2, ..., en])
๋ฐฐ์ด์ด ์์ ๋ head ์ ๋๋จธ์ง๋ถ๋ถ (tail) ์ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ๋ง ์๋ค๋ฉด arrSum ์ ํด๊ฒฐํ ์ ์๋ค.
function arrSum(arr) {
if (arr.length === 0) {
// ์ฌ๊ท์ ๊ธฐ์ด (base case)
return 0 // ๋ฌธ์ ๋ฅผ ๋ ์ด์ ์ชผ๊ฐค ์ ์์ ๋ ๋จ์ํ ๋ฌธ์ ์ ํด๋ต์ ๋ฆฌํด
}
return head + arrSum(tail) // ๋ ์์ ๋ฌธ์ ๋ก ์๋กญ๊ฒ ์ ์๋ ๋ฌธ์ (recursive case)
}
๊ณ์ ์ฐ์ต์ ํด์ผ ์์ ๊ฑฐ ํ๋ฏ์ด ์ต์ํด ์ง ๊ฒ์ด๋ผ ์๊ฐํ๋ค.