Bibi's DevLog ๐ค๐
[์ธํ๋ฐ]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)
: ํ ์คํธ๊ฐ ๊ฐ๋ฐ์ ์ด๋์ด ๋๊ฐ๋ ํํ์ ๊ฐ๋ฐ๋ก . ํ ์คํธ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ๋ฐฉ์?
TDD(Test-driven Development) ์๊ฐ
โ์ต๊ทผ ํ์ ๊ฐ ๋๊ณ ์๋ TDD์ ๋ํ ๊ด์ฌ์ด ๊ฐ์๋ก ๊น์ด์ง๊ณ ์์ต๋๋ค. ๊ณผ์ฐ TDD๋ ๋ฌด์์ธ์ง ์ด๋ฒ ...
blog.naver.com