재귀 연습문제

현채은·2023년 4월 12일
0

💡 9. take


문제

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

✍🏻 수도코드

function take(num, arr) {
  // 입력: num, arr -> 출력: num개의 요소만 포함된 새로운 배열
  // ✨ basecase(더이상 쪼개지지 않는 경우) : arr의 길이가 0이거나 num이 0이라면
  if(arr.length===0 || num === 0){
    // 빈 배열을 리턴
    return [];
  }
  // ✨recursive case (그렇지 않은 경우)
  // 배열의 첫번째 요소를 head변수에 저장
  const head = arr[0]
  // 배열의 1번째 요소부터 마지막 요소까지 tail에 저장
  const tail = arr.slice(1) 
  // head에 저장된 변수를 배열로 감싸고, concat을 통해 take함수의 리턴값을 합친다.
  return [head].concat(take(num-1,tail))
}
	```
  • ex > ①. take( 2, [1,2,3,4] )를 입력받은 경우

    • head = 1
    • tail = [2,3,4]
    • return [1].concat(take(1,[2,3,4]))
      • ②. take(1,[2,3,4]) 실행
      • head = 2
      • tail = [3,4]
      • return [2].concat(take(0,[3,4]))
        ▫︎ ③. take(0,[3,4]) 실행
        ▫︎ num=0이기 때문에 []를 리턴
        ➡️ 결과적으로 take(0,[3,4])의 리턴값은 []
        ➡️ take( 1,[2,3,4] )의 리턴값은 [2]와 []를 합친 [2]
        ➡️ take( 2, [1,2,3,4] )의 리턴값은 [1].concat[2]인 [1,2]가 된다

    💡 12. reverseArr


    문제

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

    ✍🏻 수도코드

function reverseArr(arr) {
 // 입력 : 배열 -> 출력: 순서가 뒤집힌 배열
 // ✨ basecase(더이상 쪼개지지 않는 경우) : arr의 길이가 0인 경우
 if(arr.length === 0){
   // 빈 배열을 리턴
   return []
 }
  // ✨recursive case (그렇지 않은 경우)
 // 배열의 첫번째 요소를 head변수에 저장
 let head = arr[0]
 // 배열의 1번째 요소부터 마지막 요소까지 tail에 저장
 let tail = arr.slice(1)
 // 재귀함수에 tail을 넣어주고 결과값을 concat으로 head와 합쳐준다
 return reverseArr(tail).concat(head);
}
	```
  • ex > ①. reverseArr([1, 2, 3])

    • head = 1
    • tail = [2,3]
    • return reverseArr([2,3]).concat(1)
      • reverseArr([2,3])
      • head = 2
      • tail = [3]
      • return reverseArr([3]).concat(2)
        ▫︎ reverseArr([3])
        ▫︎ head = 3
        ▫︎ tail = [ ]
        ▫︎ return reverseArr([ ]).concat(3)
        - reverseArr([ ]) ➡️ return [ ]
        ➡️ reverseArr([ ]) 의 return값은 [ ]이기 때문에 [ ].concat(3) => [3]
        ➡️ reverseArr([3])의 return값은 [3]이기 때문에 [3].concat(2) => [3, 2]
        ➡️reverseArr([2,3])의 return 값은 [3, 2]이기 때문에 [3, 2].concat(1) => [3, 2, 1]
        ⭐️ 결과적으로 reverseArr의return 값은 [3,2,1]이 된다 !

    💡 15. flattenArr


    문제

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

    ✍🏻 수도코드

function flattenArr(arr) {
 // ✨ base case (더이상 쪼개지지 않는 경우)
 if (arr.length === 0) {
   // 빈 배열 리턴
   return [];
 }
 // ✨ recursive case ( 그렇지 않은 경우 )
 // 배열의 첫번째 요소를 head변수에 저장
 const head = arr[0];
 // 배열의 1번째 요소부터 마지막 요소까지 tail에 저장
 const tail = arr.slice(1);
 // 만약 첫번째 요소가 배열이라면 ?
 if (Array.isArray(head)) {
 	// 스프레드 문법을 통해 배열을 풀어준 뒤 다시 재귀함수에 입력 
   return flattenArr([...head, ...tail]);
 } else { // 해당 요소가 배열이 아니라면 ? ( head의 배열이 spread문법으로 일차원으로 변경된 상태 )
 	// 배열이 아닌 head값은 []로 감싸주고 tail에 할당된 배열을 재귀함수에 입력 
   return [head].concat(flattenArr(tail));
 }
}
	```
  • ex > flattenArr([[1], 2, [3, 4], 5])
    • arr [0] ➡️ [[1], 2, [3, 4], 5] : 배열
    • flattenArr([...head, ...tail]) = flattenArr( [1], 2, [3,4], 5 )
    • arr[0] = [1] : 배열 ➡️ spread문법 ➡️ flattenArr( 1, 2, [3,4], 5 )
    • arr[0] = 1 : 배열 X ➡️ [1].concat((flattenArr(2,[3,4],5)) ...
profile
프론트엔드 개발자

0개의 댓글