โœŠ ํ•„์˜ค์˜ ๊ฐœ๋ฐœ์ผ์ง€
Back to Posts
2018๋…„ 9์›” 7์ผ

CodeSpitz78 2/ ๋ฃจํ‹ด ์‹ฌํ™”

CodeSpitz78 2/ ๋ฃจํ‹ด ์‹ฌํ™”

๐ŸŒ•๐ŸŒ‘๐ŸŒ‘

๐Ÿ”ฅ ์ฝ”๋“œ์Šคํ”ผ์ธ  ์ˆ˜์—…์„ ์ˆ˜๊ฐ•ํ•˜๋ฉด์„œ ๋ณต์Šตํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณต๋ถ€ ํ›„์—๋Š” ํ’€์–ด์„œ ์‰ฌ์šด ์–ธ์–ด๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ์Šตํ•˜์ž.


1. ์ฐธ์กฐ ์ „ํŒŒ์˜ ๋ฌธ์ œ


2. ์„œ๋ธŒ๋ฃจํ‹ด์˜ ์ฒด์ธ

keep์˜ ์ •ํ™•ํ•œ ๋Œ€์ƒ

- ํ•จ์ˆ˜ ์ฝœ์„ return ์ดํ›„๋กœ ์˜ฎ๊ฒผ๋‹ค.


3. ์žฌ๊ท€ ๊ผฌ๋ฆฌ ์ตœ์ ํ™” Tail Recursion - for๋ฌธ์˜ ๋„์›€์„ ๋ฐ›์ง€ ์•Š๊ณ ๋„ ๊ณ ์„ฑ๋Šฅ์˜ ๋ฃจํ”„๋ฅผ

๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. - ์‚ฌํŒŒ๋ฆฌ๊ฐ€ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค. ํฌ๋กฌ X, ์—ฃ์ง€ X - tail recursion์„ ์ง€์›ํ•œ๋‹ค. - script time out๋งŒ ๋‚œ๋‹ค. - stack over flow๋Š” ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. - ์–ธ์–ด๋งˆ๋‹ค tail recursion์ด ์ด๋ค„์ง€๋Š” ์กฐ๊ฑด์„ ์ •์˜ํ•ด ๋‘”๋‹ค. - ํšจ์œจ์ ์ธ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์งค ์ˆ˜ ์žˆ๋‹ค.

** *์˜ˆ์‹œ **

const sum = v => v + (v ? sum(v - 1) : 0); sum(3); // 1. 3 + sum(2) // 2. 2 + sum(1) // 3. 1 + 0

์ธ์ž๋กœ ์˜ฎ๊ฒจ์„œ ์Šคํƒ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋„๋ก ํ•˜์˜€๋‹ค.

์—ฐ์‚ฐ์„ ์ธ์ž๋กœ ์˜ฎ๊ธด๋‹ค!!

const sum = (v, prev = 0) => { prev += v; return v > 1 ? sum(v - 1, prev) : prev; }; sum(3); // 1. sum(v:3, prev:0) return sum(2,3) // 2. sum(v:2, prev:3) return sum(1,5) // 3. sum(v:1, prev:5) reutrn 6 // 3๋ฒˆ์งธ return๊ฐ’์ด ์ฒซ๋ฒˆ์งธ sum(3)์˜ ๋ฆฌํ„ดํฌ์ธํŠธ๋กœ ๋ฆฌํ„ด๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ tail recursion ์•ˆ ์ผ์œผํ‚ค๋Š” ์—ฐ์‚ฐ์ž (์–ธ์–ด์ˆ˜์ค€์—์„œ ์ •์˜๋˜์–ด์žˆ์Œ)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ด๋ฏธ ES6์—์„œ๋Š” tail recursive๋ฅผ ์ง€์›ํ•˜๊ฒŒ๋” ์ŠคํŽ™์œผ๋กœ ์ง€์ •ํ•ด๋†“์•˜๋‹ค. JVM์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

4. ๐Ÿš€๐Ÿš€ ์žฌ๊ท€๋ฅผ ๋ฃจํ”„๋กœ Tail Recursion to loop - ์ž์œ ๋กญ๊ฒŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. -

์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค..

const sum = (v, prev = 0) => { prev += v; return v > 1 ? sum(v - 1, prev) : prev; };
const sum = v => { let prev = 0; while (v > 1) { prev += v; v--; } return prev; };

5. โœจํด๋กœ์ €โœจ - ์–ธ์–ด์ ์ธ ์žฅ์น˜๋ผ๊ณ  ์ƒ๊ฐํ•˜์ž.

5-1. Static state

- ์ด๋ ‡๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์–ธ์–ด๊ฐ€ C์–ธ์–ด์ด๋‹ค. - ๋ฃจํ‹ด์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ฌธ์œผ๋กœ ๋˜์–ด์žˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ฒ˜๋Ÿผ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋‹ค. - ์„œ๋ธŒ๋ฃจํ‹ด์„ ๊ฐ’์˜ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์–ธ์–ด๊ฐ€ ์žˆ๊ณ , ๋ฌธ์œผ๋กœ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์–ธ์–ด๊ฐ€ ์žˆ๋‹ค. - ์ž๋ฐ”์˜ ๋ฉ”์†Œ๋“œ๋Š” ๋ฌธ์ด๋‹ค. ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์„ ์–ธ๋˜์–ด์•ผํ•œ๋‹ค. ์™ธ๋ถ€์—์„œ ๋Œ€์ž…๋  ์ˆ˜ ์—†๋‹ค. - ๊ฐ’์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉด ์‹คํ–‰ ์ค‘๊ฐ„์— ๋ฃจํ‹ด์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. - ๋žŒ๋‹ค - ๋ฃจํ‹ด์„ ๋žŒ๋‹ค๋กœ ๋ณผ๋ž˜. - c์–ธ์–ด์˜ ํ•จ์ˆ˜ํฌ์ธํ„ฐ์—์„œ ๋ฐœ์ „ํ•ด์˜จ ๊ฐœ๋…. - ๋Ÿฐํƒ€์ž„์— ์„œ๋ธŒ๋ฃจํ‹ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

ํด๋กœ์ €๋Š” ์˜ค์ง ๋Ÿฐํƒ€์ž„ ์ค‘์— ๋ฃจํ‹ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด์—์„œ ์ƒ๊ฒจ๋‚œ๋‹ค. - c์—์„œ๋Š” static ๋ฉ”๋ชจ๋ฆฌ - ๊ทธ๋ ‡๋‹ค๊ณ  ์ด๋Ÿฐ์ƒํ™ฉ์—์„œ ๋ชจ๋“  ์–ธ์–ด๊ฐ€ ํด๋กœ์ €๋ฅผ ์ƒ์‚ฐํ•˜์ง„ ์•Š๋Š”๋‹ค.. - ์–ธ์–ด ๋””์ž์ด๋„ˆ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •ํ–ˆ๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. - ํ•จ์ˆ˜๋ฅผ ๋ฌธ์œผ๋กœ ๋งŒ๋“œ๋Š” ์–ธ์–ด์˜ ํŠน์„ฑ

5-2. Runtime state

=> ์šฐ๋ฆฌ๊ฐ€ ์ง  ์ฝ”๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด =>


6. ์ค‘์ฒฉ ํด๋กœ์ € nested closure - ํด๋กœ์ €๋Š” ๋ฃจํ‹ด๋งŒ์ด ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. -

ES6์—์„œ๋Š” block๋งŒ ์ฃผ์–ด๋„ ์Šค์ฝ”ํ”„๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. - ์Šค์ฝ”ํ”„ ์ƒ์„ฑ์€ ํด๋กœ์ €๋ฅผ ๋งŒ๋“œ๋Š” ํ–‰์œ„์ด๋‹ค. - block๋งŒ ์ฃผ์–ด๋„ ํด๋กœ์ €๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

- ์—ฐ์†์ ์ธ ํด๋กœ์ €๊ฐ€ ํƒ„์ƒํ•œ๋‹ค. - ์ค‘์ฒฉ๋˜์–ด ์žˆ๋Š” ํด๋กœ์ €๋ฅผ ๋งˆ๊ตฌ๋งˆ๊ตฌ ์ƒ์„ฑ๋œ๋‹ค.

์œ„ ๊ทธ๋ฆผ์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•œ๋‹ค๋ฉด..

window.a = 3; // main flow์˜ ์ „์—ญ: global if (a == 3) { // ์ฒซ๋ฒˆ์งธ block const b = 5; const f1 = v => { // ์ฒซ๋ฒˆ์งธ routine const c = 7; if (a + b > c) { // ๋‘๋ฒˆ์งธ block return p => v + p + a + b; // ๋‘๋ฒˆ์งธ routine // ์ž์œ ๋ณ€์ˆ˜๋ฅผ ๋ฌผ๊ณ  ์žˆ์Œ => ํด๋กœ์ € } else { return p => v + p + a + b; } }; }

7. ์‰๋„์ž‰

- ์ธต์ธต์ด ์ค‘์ฒฉ๋˜์–ด์žˆ๋Š” ํด๋กœ์ €๊ฐ€ ์žˆ๋Š”๋ฐ ๊ฐ๊ฐ์˜ ํด๋กœ์ €์—์„œ ๋˜‘๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ์„๋•Œ ์ผ์–ด๋‚œ๋‹ค.

const a = 3; // main flow์— A if (a == 3) { // block scope const a = 5; // ?! a๊ฐ€ ๋˜ ์žˆ์Œ. const f1 = v => { const a = 7; // ???!! a๊ฐ€ ๋˜์žˆ์Œ!! console.log(a); }; }
const a = 3; // main flow์— A if (a == 3) { // block scope const a = 5; // ๋ณดํ˜ธ๋ง‰์„ ๋งŒ๋“  ๊ฐœ๋… const f1 = v => { console.log(a); // ์„œ๋ธŒ๋ฃจํ‹ด ์ƒ์œ„์˜ a์— ์ ‘๊ทผ }; }

8. ์ฝ”๋ฃจํ‹ด

์ผ๋ฐ˜์ ์ธ ๋ฃจํ‹ด

์ฝ”๋ฃจํ‹ด

์ฝ”๋ฃจํ‹ด์„ ์ด์šฉํ•ด์„œ ์ข‹์€ ์ 

๋ฃจํ”„์—์„œ ์ฝ”๋ฃจํ‹ด

์ œ๋„ˆ๋ ˆ์ดํ„ฐ

const generator = function* (a) { a++; yield a; a++; yield a; a++; yield a; }; const coroutine = generator(3);
let result = 0; result += coroutine().value; console.log(result);
let result = 0; result += coroutine.next().value; console.log(result); // 4

๊ณผ์ œ

๋‹ค์Œ์˜ ์ฝ”๋“œ๋Š” ๊ตฌ๊ตฌ๋‹จ์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ด๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์ œ๋„ค๋ ˆ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜์‹œ์˜ค.

const generator_Joy = function* (i, j) { for (let a = 1; a < i + 1; a++) { for (let b = 1; b < j + 1; b++) { const c = a * b; yield [a, b, c]; } } }; for (const [i, j, k] of generator_Joy(9, 9)) { console.log(`${i} x ${j} = ${k}`); }
// ์–ด๋–ค ๋ถ„์˜ ์˜์‹์˜ ํ๋ฆ„ const generator_Aus1 = function* (i, j) { for (let a = 1, b = 1; a < i; b++) { if (b === j) { a++; b = 0; } yield [a, b, a * b]; } }; const generator_Aus2 = function* (i, j) { for (let a = 1, b = 1; a <= i; b++) { if (b === j) { a++; b = 0; } yield [a, b, a * b]; } }; const generator_Aus3 = function* (i, j) { for (let a = 1, b = 1; a <= i; b >= j ? (b = 0 + !!a++) : b++) { yield [a, b, a * b]; } };
PreviousCodeSpitz78 3/ (stack ๊ตฌ์กฐ) HTML parser โœจโœจ
NextCodeSpitz78 1/ ๋ฃจํ‹ด๊ณผ ๊ฒฐํ•ฉ๋„-์‘์ง‘๋„ ๋ชจ๋ธ

Related

ยฉ 2025 Felix