Bibi's DevLog ๐Ÿค“๐ŸŽ

[์ธํ”„๋Ÿฐ]Javascript์ž…๋ฌธ - ์žฌ๊ท€์˜ ๊ธฐ์ดˆ ๋ณธ๋ฌธ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Javascript ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

[์ธํ”„๋Ÿฐ]Javascript์ž…๋ฌธ - ์žฌ๊ท€์˜ ๊ธฐ์ดˆ

๋น„๋น„ bibi 2020. 10. 31. 21:45
* ์ด ๊ธ€์€ ์ธํ”„๋Ÿฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ˜ธ๋ˆ…์Šค๋‹˜์˜ ์œ ๋ฃŒ ๊ฐ•์˜ '์‰ฝ๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐฐ์›Œ๋ณด๋Š” Javascript ์ž…๋ฌธ - ์ฝ”๋“œ์Šค์ฟผ๋“œ ๋งˆ์Šคํ„ฐ์ฆˆ ์ฝ”์Šค ๋ ˆ๋ฒจ1'๋ฅผ ๋“ฃ๊ณ  ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ๊ฐ•์˜ ๋‚ด์šฉ์— ๋”ํ•ด, ์ œ๊ฐ€ ํ•„๊ธฐํ•˜๊ณ  ๊ตฌ๊ธ€๋งํ•œ ๋‚ด์šฉ์ด ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๋ณด์ธ ์ œ๊ฐ€ ์ดํ•ดํ•œ ๋Œ€๋กœ ์ •๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ถ€์ •ํ™•ํ•œ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ์„ ๊ฐ์•ˆํ•ด ์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ธ€์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ธํ”„๋Ÿฐ ์ธก ๋‹ต๋ณ€์„ ๋ฐ›์€ ์ ์ด ์žˆ์œผ๋‚˜(https://bibi6666667.tistory.com/37), ์ €์ž‘๊ถŒ์ƒ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค๋ฉด ๋ณดํ˜ธ ๋ชจ๋“œ(๋น„๊ณต๊ฐœ)๋กœ ์ „ํ™˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์žฌ๊ท€ (recursion)๋ž€?

์žฌ๊ท€ recursion (์žฌ๊ท€ํ•จ์ˆ˜) : ํ•จ์ˆ˜๊ฐ€ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ

var foo = function() {
	foo(); 
}

์œ„์˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด?
- ๋ฌดํ•œ๋ฃจํ”„์ฒ˜๋Ÿผ foo()-foo()-foo()-... ํ˜ธ์ถœ๋งŒ ํ•˜๋‹ค๊ฐ€ ์ฃฝ๋Š”๋‹ค.

 


์นด์šดํŠธ๋‹ค์šด ์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

์นด์šดํŠธ๋‹ค์šด = 10, 9, 8, 7, ... 3, 2, 1 ์„ธ๊ธฐ.

์นด์šดํŠธ ๋‹ค์šด ์ผ๋ฐ˜ ๋ฒ„์ „

var countdown = function(n) {
  for (let i = n; i >= 0; i--) {
    	console.log(i);
    } 
    console.log("Fire!");
  };
  
countdown(10);

 

์นด์šดํŠธ๋‹ค์šด ์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ 1

var countdown2 = function(n) {
    console.log(n);
    countdown2(n - 1); 
};

countdown2(10) ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด..
10 ์ฐ๊ณ  countdown2(9) ํ˜ธ์ถœ - 9์ฐ๊ณ  countdown(8) ํ˜ธ์ถœ - 8์ฐ๊ณ  countdown(7)ํ˜ธ์ถœ ..

โ— ์œ„ ์ฝ”๋“œ๋Š” ์ข…๋ฃŒ ์กฐ๊ฑด์ด ๋น ์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌดํ•œ ๋ฃจํ”„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ข…๋ฃŒ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!
(10, 9, 8, 7, ... 3, 2, 1, 0, -1, -2, -3, ...)
์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ์ข…๋ฃŒ ์กฐ๊ฑด์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

 

์žฌ๊ท€ ํ•จ์ˆ˜์— ์ข…๋ฃŒ ์กฐ๊ฑด ์ถ”๊ฐ€

  • ์ข…๋ฃŒ์กฐ๊ฑด (termination condition) : ์ฃผ๋กœ if๋ฌธ๊ณผ return;์„ ํ†ตํ•ด ์žฌ๊ท€๊ฐ€ ์ข…๋ฃŒ๋จ.
var countdown2 = function(n) {
  //termination condition 
  if (n <= 0) {
  	console.log("๋•ก");
 	return; 
  } 
  
  console.log(n);
  countdown2(n - 1); 
};

countdown2(10); // 10 9 8 7 6 5 4 3 2 1 ๋•ก
  • ์žฌ๊ท€์—๋Š” ๋ฐ˜๋“œ์‹œ ์ข…๋ฃŒ์กฐ๊ฑด์ด ํ•„์š”ํ•˜๋‹ค.
    -> return;์„ ์‚ฌ์šฉํ•ด ํ•จ์ˆ˜๋ฅผ ๋๋‚ธ๋‹ค.
    (n์ด 0์ด ๋˜๋Š” ์‹œ์ ์—์„œ return์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด!)
return; ์˜ ๋‘ ๊ฐ€์ง€ ์˜๋ฏธ
1. ๊ฐ’์„ ๋Œ๋ ค์ค€๋‹ค.
2. ํ•จ์ˆ˜๋ฅผ ๋๋‚ธ๋‹ค. (return;์œ„์น˜์—์„œ)
์žฌ๊ท€์˜ 2์š”์†Œ (์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ )
1. ์ข…๋ฃŒ์กฐ๊ฑด (๋ฐ˜๋“œ์‹œ ์ข…๋ฃŒ์กฐ๊ฑด์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.) -> if๋ฌธ๊ณผ return;์„ ์‚ฌ์šฉ.
2. ์ž๊ธฐ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋ฉฐ, ์ด ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง -> countdown2(n-1); ์ฒ˜๋Ÿผ.

 


์™œ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜?

  • ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ’€๋ฆฌ๋Š” ๋ฌธ์ œ๋“ค์ด ๋งŽ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ฆฌ์ŠคํŠธ, ํŠธ๋ฆฌ, ๊ทธ๋ž˜ํ”„ ์ˆœํšŒ ๋ฌธ์ œ๋Š” ์žฌ๊ท€๋กœ ํ‘ธ๋Š” ๊ฒŒ ํŽธํ•ฉ๋‹ˆ๋‹ค.

์žฌ๊ท€ vs ์ผ๋ฐ˜

  • ์ผ๋ฐ˜ ํ•จ์ˆ˜๊ฐ€ ์žฌ๊ท€ ํ•จ์ˆ˜๋ณด๋‹ค ๋†’์€ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค.
  • ๋ชจ๋“  ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ผ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.
    (but.. ์ˆ˜ํ•™์ ์œผ๋กœ ์ฆ๋ช…์€ ๋˜์–ด ์žˆ์ง€๋งŒ, ์žฌ๊ท€๋ฅผ ์ผ๋ฐ˜์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒŒ ์‰ฝ์ง€๋Š” ์•Š๋‹ค)

๊ทธ๋Ÿฐ๋ฐ ์™œ?

"์žฌ๊ท€ ์—†์ด ๊ตฌํ˜„ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ข‹์•„์ง€๊ณ , ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๋Šฅ๋ ฅ์ด ์ข‹์•„์ง‘๋‹ˆ๋‹ค."
                                                                                                      - ๋ˆ„๊ตฐ๊ฐ€์˜ ๋ง..

 

์ฝ”๋”ฉ์—์„œ ๋ฌธ๋ฒ•์„ ์•„๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ์ž‘์€ ๋น„์ค‘์„ ์ฐจ์ง€ํ•œ๋‹ค.
๋ฌธ๋ฒ•๋ณด๋‹ค ์ค‘์š”ํ•œ ๊ฒƒ์€, ์ปดํ“จํ„ฐ์™€ ๋Œ€ํ™”ํ•˜๋Š” "์‚ฌ๊ณ ๋ ฅ" - ์ปดํ“จํŒ… ์‚ฌ๊ณ (์ปดํ“จํ„ฐ์  ์‚ฌ๊ณ , computational thinking) ์ด๋‹ค.
์ด ์‚ฌ๊ณ ๋ ฅ์„ ์ฆ์ง„์‹œํ‚ค๋Š” ๋ฐ์— ์žฌ๊ท€์˜ ์‚ฌ์šฉ์ด ๋„์›€์ด ๋œ๋‹ค.


์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ - ์—ฐ์Šต

  • a๋ถ€ํ„ฐ b๊นŒ์ง€ ์ •์ˆ˜๋ฅผ ๋”ํ•ด์„œ ๋ฆฌํ„ดํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž.
var rsum = function(a, b) { 
    if (a == b) {
    	return a;
    } 
    return b + rsum(a, b - 1);
}

var x = rsum(1, 10);
console.log(x);
๐Ÿ‘‰์žฌ๊ท€์—์„œ๋Š” ๋ณดํ†ต ์นด์šดํŠธ๋‹ค์šด ๋ฐฉ์‹์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.
(1๋ถ€ํ„ฐ 5๊นŒ์ง€ ๋”ํ•˜๋”๋ผ๋„, 1+2+3+4+5 ๊ฐ€ ์•„๋‹Œ 5+4+3+2+1 ๋กœ ์ฃผ๋กœ ๊ตฌํ•œ๋‹ค)

 

 

์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ - ํŒฉํ† ๋ฆฌ์–ผ 

fact(3) = 3 * 2 * 1

ํŒฉํ† ๋ฆฌ์–ผ (factorial, ๊ณ„์Šน) : n! = 1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ๋ชจ๋“  ์ •์ˆ˜๋ฅผ ๊ณฑํ•˜๋Š” ๊ฒƒ . 3! = 3*2*1.

 

↓ (์˜ˆ์™ธ์ฒ˜๋ฆฌ ์—†๋Š” ๊ฐ„๋‹จ ๋ฒ„์ „)

var fact = function(n) {
    if (n === 1) {
        return n;
    }
    return n * fact(n-1);
};

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>์žฌ๊ท€๋กœ ํŒฉํ† ๋ฆฌ์–ผ ๊ตฌํ˜„ํ•˜๊ธฐ</h1>
<script>
var fact = function (n){
    if (n < 0) { // ์˜ˆ์™ธ์ฒ˜๋ฆฌ : n์ด 0๋ณด๋‹ค ์ž‘์„ ๋•Œ.
        return NaN; // ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜.
    }
    if (n == 1 || n == 0) { // ์˜ˆ์™ธ์ฒ˜๋ฆฌ : n์ด 1์ด๊ฑฐ๋‚˜ 0์ด๋ฉด
        return 1; // 1์„ ๋ฐ˜ํ™˜.
    }
    return n * fact(n - 1);
};

// ํ…Œ์ŠคํŠธ ์ฝ”๋“œ : true๊ฐ€ ๋‚˜์™€์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์งœ๊ณ ,
// ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ true๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ์ฝ”๋”ฉํ•œ๋‹ค.
console.log(fact(1) === 1);
console.log(fact(2) === 2);
console.log(fact(3) === 6);
console.log(fact(0) === 1);
console.log(!fact(-1));
</script>
</body>
</html>

 

โ— NaN === NaN ์˜ ๊ฒฐ๊ณผ๊ฐ’์€? false์ด๋‹ค!
๐Ÿ‘‰ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ (TDD, Test-Driven Development)
: ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐœ๋ฐœ์„ ์ด๋Œ์–ด ๋‚˜๊ฐ€๋Š” ํ˜•ํƒœ์˜ ๊ฐœ๋ฐœ๋ก . ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ๋ฐฉ์‹?

m.blog.naver.com/PostView.nhn?blogId=suresofttech&logNo=221569611618&proxyReferer=https:%2F%2Fwww.google.com%2F

 

TDD(Test-driven Development) ์†Œ๊ฐœ

โ€‹์ตœ๊ทผ ํ™”์ œ๊ฐ€ ๋˜๊ณ  ์žˆ๋Š” TDD์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ๊ฐˆ์ˆ˜๋ก ๊นŠ์–ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณผ์—ฐ TDD๋ž€ ๋ฌด์—‡์ธ์ง€ ์ด๋ฒˆ ...

blog.naver.com