Code States
Front-end boost camp
Today
I
Learned
🧢 41일차.. 재귀와 알고리즘..!
// 문제 : 자연수를 입력받고, 입력받은 수부터 1까지의 자연수를 모두 곱한 값을 리턴하는 재귀 함수 `fac` 을 작성하세요.
// 예제 1)
fac(5) === 5 * 4 * 3 * 2 * 1 === 120
// 예제 2)
fac(3) === 3 * 2 * 1 === 6
function sumTo(num) {
// TODO: 여기에 코드를 작성합니다.
// 별도의 최적화 기법(memoization)은 금지됩니다.
if (num <= 1) {
return num;
}
return num + sumTo(num-1);
}
function isOdd(num) {
// TODO: 여기에 코드를 작성합니다.
if (num === 0) {
return false;
} else if (num === 1) {
return true;
}
if (num < 0) {
return isOdd(-num);
}
return isOdd(num - 2);
}
function factorial(num) {
// TODO: 여기에 코드를 작성합니다.
// 별도의 최적화 기법(memoization)은 금지됩니다.
if (num === 1 || num === 0) {
return 1
}
return num * factorial(num - 1);
}
function fibonacci(num) {
// TODO: 여기에 코드를 작성합니다.
// 별도의 최적화 기법(memoization)은 금지됩니다.
if (num === 0) {
return 0
} else if (num === 1) {
return 1
}
return fibonacci(num - 1) + fibonacci(num - 2);
}
function arrSum(arr) {
// TODO: 여기에 코드를 작성합니다.
let n = arr.length;
if (n === 0) {
return 0
}
const head = arr[0];
const tail = arr.slice(1);
return head + arrSum(tail);
}
function arrProduct(arr) {
// TODO: 여기에 코드를 작성합니다.
if (arr.length === 0) {
return 1;
}
const head = arr[0];
const tail = arr.slice(1);
return head * arrProduct(tail);
}
function arrLength(arr) {
// TODO: 여기에 코드를 작성합니다.
if (arr.isEmpty() === true) {
return 0
}
const tail = arr.slice(1);
return 1 + arrLength(tail);
}
function drop(num, arr) {
// TODO: 여기에 코드를 작성합니다.
if (num === 0 || arr.length === 0) {
return arr;
}
const tail = arr.slice(1);
return drop(num - 1, tail);
}
function take(num, arr) {
// TODO: 여기에 코드를 작성합니다.
if (num === 0 || arr.length === 0) {
return [];
}
const head = arr[0];
const tail = arr.slice(1);
return [head].concat(take(num - 1, tail));
}
function and(arr) {
// TODO: 여기에 코드를 작성합니다.
if (arr.length === 0) {
return true
}
const head = arr[0];
const tail = arr.slice(1);
return head && and(tail);
}
function or(arr) {
// TODO: 여기에 코드를 작성합니다.
if (arr.length === 0) {
return false;
}
const head = arr[0];
const tail = arr.slice(1);
return head || or(tail);
}
function reverseArr(arr) {
// TODO: 여기에 코드를 작성합니다.
if (arr.length === 0) {
return [];
}
const head = arr[0];
const tail = arr.slice(1);
return reverseArr(tail).concat(head)
}
function findMatryoshka(matryoshka, size) {
// TODO: 여기에 코드를 작성합니다.
if (Object.keys(matryoshka).length === 0) {
return false;
} else {
if (matryoshka.size === size) {
return true;
}
else if (matryoshka.matryoshka && matryoshka.size > size) {
return findMatryoshka(matryoshka.matryoshka, size)
}
else return false;
}
}
function unpackGiftbox(giftBox, wish) {
// recursive case
for (let i = 0; i < giftBox.length; i++) {
if (giftBox[i] === wish) {
return true;
} else if (Array.isArray(giftBox[i])) {
const result = unpackGiftbox(giftBox[i], wish);
if (result === true) {
return true;
}
}
}
// base case
return false;
}
function flattenArr(arr) {
// base case
if (arr.length === 0) {
return [];
}
// recursive case
const head = arr[0];
const tail = arr.slice(1);
if (Array.isArray(head)) {
return flattenArr([...head, ...tail]);
} else {
return [head].concat(flattenArr(tail));
}
}
리액트 보단 알고리즘 푸는게 낫다... ㄷㄷ 어렵지만 어찌 이런 생각을 해냈는지 신기해... 과거 수학자들과 이 내용을 프로그래밍에 이용하는 개발자들에 경외심이 생겨버릠,,