재귀 함수 문제 복습

Jelkov Ahn·2021년 10월 6일
0

JS/NODE(재귀함수)

목록 보기
2/3
post-thumbnail

(1) 문제

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

  • 입출력 예시
let output = isOdd(17);
console.log(output); // --> true

output = isOdd(-8);
console.log(output); // --> false
  • 코드
function isOdd(num) {
  if (num === 0){
    return false;
  }else if (num === 1){
    return true;
  }
  if(num<0){
    return isOdd(-num)
  }
  return isOdd(num-2)
  // TODO: 여기에 코드를 작성합니다.
}
  • 풀이
    짝수일때는 false, 홀수일때는 true가 리턴
    재귀함수를 사용하기 위해서 매개변수가 0일때 false/ 1일때는 true를 설정 해놓는다.
    그리고 음수일때는, 재귀 함수를 통해서 다시 양수로 바꿔준다.
    그리고 -2씩 계속 빼서, 0,1 인 값의 리턴을 통해서 결과값을 도출 해준다.

(2) 문제

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

  • 입출력 예시
let output = factorial(10);
console.log(output); // --> 3628800
  • 코드
function factorial(num) {
  if(num <= 1) {
    return 1;
  }
  return num*factorial(num-1);
  // TODO: 여기에 코드를 작성합니다.
  // 별도의 최적화 기법(memoization)은 금지됩니다.
}
  • 주의사항
    함수 factorial은 재귀함수의 형태로 작성합니다.
    반복문(for, while) 사용은 금지됩니다.
    factorial(0)은 1로 정의됩니다.
    음수 입력은 들어오지 않습니다.

  • 풀이
    0, 1 이 들어올 경우 1로 정의 한다.
    num=3
    numfactorial(num-1); 이것의 리턴 값은,
    factorial(3) = 3
    factorial(2);
    factorial(2) = 2*factorial(1);
    factorial(1) = 1
    factorial(2) = 2
    factorial(3) = 6

(3) 문제

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

  • 입출력 예시
let output = fibonacci(5);
console.log(output); // --> 5

output = fibonacci(9);
console.log(output); // --> 34
  • 주의사항
    함수 fibonacci는 재귀함수의 형태로 작성합니다.
    반복문(for, while) 사용은 금지됩니다.
    피보나치 수열은 0번부터 시작합니다.

  • 코드

function fibonacci(num) {
  if (num <= 1){
    return num;
  }
  return fibonacci(num-1)+fibonacci(num-2);
  // TODO: 여기에 코드를 작성합니다.
  // 별도의 최적화 기법(memoization)은 금지됩니다.
}
  • 풀이
    만약 num === 5 라면
    return fibonacci(4)+fibonacci(3);
    fibonacci(4)
    return fibonacci(3) +fibonacci(2)
    fibonacci(3)
    return fibonacci(2) + 1

(4) 문제

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

  • 입출력 예시
const matryoshka = {
  size: 10,
  matryoshka: {
    size: 9,
    matryoshka: null,
  },
};

let output = findMatryoshka(matryoshka, 10);
console.log(output); // --> true

output = findMatryoshka(matryoshka, 8);
console.log(output); // --> false
  • 주의사항
    함수 findMatryoshka는 재귀함수의 형태로 작성합니다.
    반복문(for, while) 사용은 금지됩니다.
    입력받은 객체는 함수의 호출 뒤에도 처음 상태를 유지해야 합니다(immutability).
    빈 객체를 입력받은 경우, false를 리턴해야 합니다.

  • 코드

function findMatryoshka(matryoshka, size) {
  if(matryoshka.size === size){
    return true;
  }else if(matryoshka.matryoshka === null){
    return false;
  }
  if(matryoshka.size > size){
    return findMatryoshka(matryoshka.matryoshka, size)
  }else {
    return false;
  }
  // TODO: 여기에 코드를 작성합니다.
}
  • 풀이
    (1)
    if(matryoshka.size === size){
    return true;
    }
    //사이즈가 같으면 true 리턴
    (2)
    else if(matryoshka.matryoshka === null){
    return false;
    }
    // 더이상 matryoshka의 객체안에 matryoshka 객체가 없으면 false를 리턴
    (3)
    if(matryoshka.size > size){
    return findMatryoshka(matryoshka.matryoshka, size)
    }else {
    return false;
    }
    // matryoshka의 객체의 size가 변수의 size보다 큰경우 하나 안에있는 객체 matryoshka.matryoshka에서 size를 검색한다.
    그게 아닐 경우 false를 리턴한다.

(5) 문제

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

  • 입출력 예시
const giftBox = ['macbook', 'mugcup', ['eyephone', 'postcard'], 'money'];

let output = unpackGiftbox(giftBox, 'iphone');
console.log(output); // --> false

output = unpackGiftbox(giftBox, 'postcard');
console.log(output); // --> true
  • 주의사항
    함수 unpackGiftbox는 재귀함수의 형태로 작성합니다.
    반복문(for, while) 사용이 가능합니다.
    입력받은 배열은 함수의 호출 뒤에도 처음 상태를 유지해야 합니다(immutability).
    빈 배열 또는 빈 문자열을 입력받은 경우, false를 리턴해야 합니다.

  • 코드

function unpackGiftbox(giftBox, wish) {
  if(giftBox.length === 0 || wish === ''){
    return false;
  }
  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;
      }
    }
  }
  return false;
  // TODO: 여기에 코드를 작성합니다.
}
profile
끝까지 ... 가면 된다.

0개의 댓글