본문 바로가기
프로그래밍/알고리즘

재귀함수 알고리즘 문제 풀이(js)

by monicada 2022. 6. 23.
728x90

1. 수(num)를 입력받아 1부터 num까지의 합을 리턴해야 합니다.

function sumTo(num) {
  if (num <= 1) {
    return num;
  }

  return num + sumTo(num - 1);
}

 

2. 수를 입력받아 홀수인지 여부를 리턴해야 합니다

fuction isOdd(num){
 if(num === 0) {
   return false;
 } else if (num === 1){
   return true;
 } 
 
 if (num < 0){
   return isOdd(-num);
   }
   return isOdd(num -2);

 

3. 수를 입력받아 n-factorial(n!: 엔-팩토리얼) 값을 리턴해야 합니다. n!은 1부터 n까지 1씩 증가한 모든 값의 곱입니다. 

function factorial(num){
 if(num <= 1) {
  return 1;
  }
  
  return num * factorial(num -1);
 }

 

4. 수(num)를 입력받아 피보나치 수열의 num번째 요소를 리턴해야 합니다.

0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1입니다. 그 다음 2번째 피보나치 수부터는 바로 직전의 두 피보나치 수의 합으로 정의합니다.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...

function fibonacci(num) {
  if (num <= 1) {
    return num;
  }

  return fibonacci(num - 1) + fibonacci(num - 2);
}

 

5. 배열을 입력받아 모든 요소의 합을 리턴해야 합니다.

function arrSum(arr) {
  if (arr.length === 0) {
    return 0;
  }

  // const [head, ...tail] = arr;
  const head = arr[0];
  const tail = arr.slice(1);
  return head + arrSum(tail);
}

 

6. 배열을 입력받아 모든 요소의 곱을 리턴해야 합니다.

function arrProduct(arr) {
  if (arr.length === 0) {
    return 1;
  }

  // const [head, ...tail] = arr;
  const head = arr[0];
  const tail = arr.slice(1);
  return head * arrProduct(tail);
}

 

7. 배열을 입력받아 그 길이를 리턴해야 합니다. 

function arrLength(arr) {
  if (arr.isEmpty()) {
    return 0;
  }

  // const [head, ...tail] = arr;
  const tail = arr.slice(1);
  return 1 + arrLength(tail);
}

 

8. 수(num)와 배열을 입력받아 차례대로 num개의 요소가 제거된 새로운 배열을 리턴해야 합니다. 

function drop(num, arr) {
  // if (num >= arr.length) {
  //   return [];
  // }

  if (num === 0 || arr.length === 0) {
    return arr;
  }

  // const [head, ...tail] = arr;
  const tail = arr.slice(1);
  return drop(num - 1, tail);
}

 

9. 수(num)와 배열을 입력받아 차례대로 num개의 요소만 포함된 새로운 배열을 리턴해야 합니다. 

function take(num, arr) {
  // if (num >= arr.length) {
  //   return arr;
  // }

  if (num === 0 || arr.length === 0) {
    return [];
  }

  // const [head, ...tail] = arr;
  const head = arr[0];
  const tail = arr.slice(1);

  return [head].concat(take(num - 1, tail));
}

 

10. 배열을 입력받아 모든 요소의 논리곱(and)을 리턴해야 합니다. 

let output = and([true, true, true]); console.log(output);
function and(arr) {
const head = arr[0];
const tail = arr.slice(1);

if(arr.length ===0){
return true;
}

else if (head === false){
return false;
}

return and(tail);
};

 

11. 배열을 입력받아 모든 요소의 논리합(or)을 리턴해야 합니다. 

function or(arr) {
  if (arr.length === 0) {
    return false;
  }

  // const [head, ...tail] = arr;
  const head = arr[0];
  const tail = arr.slice(1);

  // if (head === true) {
  //   return true;
  // }

  return head || or(tail);
}

 

12. 배열을 입력받아 순서가 뒤집힌 배열을 리턴해야 합니다. 

function reverseArr(arr) {
  // TODO: 여기에 코드를 작성합니다.
  if(arr.length === 0){
    return arr;
  }

  const head = arr[arr.length - 1];
  const tail = arr.slice(0,arr.length - 1);

  return [head].concat(reverseArr(tail))
}

 

13. 러시아 전통인형 마트료시카에 대한 정보를 담은 객체와 수를 입력받아 조건에 맞는 인형이 있는지 여부를 리턴해야 합니다. 

function findMatryoshka(matryoshka, size) {
  // TODO: 여기에 코드를 작성합니다.
  if(matryoshka.size === size){
    return true;
  }else if(matryoshka.matryoshka && matryoshka.size > size){
    return findMatryoshka(matryoshka.matryoshka, size)
  }
  return false;
}

 

14. 선물 상자에 대한 정보를 담은 배열과 문자열을 입력받아 조건에 맞는 선물이 있는지 여부를 리턴해야 합니다. 

function unpackGiftbox(giftBox, wish) {
  // TODO: 여기에 코드를 작성합니다.
    if(giftBox.length === 0 || wish === ''){
    return false;
  }

  for (let i = 0; i < giftBox.length; i++) {
    if (giftBox[i] === wish) {
      return true;
    }

    if (Array.isArray(giftBox[i])) {
      const result = unpackGiftbox(giftBox[i], wish);
      if (result) {
        return true;
      }
    }
  }
  return false;
}

 

15. 다차원 배열을 입력받아 1차원 배열로 변환하여 리턴해야 합니다. 

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));
  }
}

댓글