재귀함수

  • 자신을 정의할 때 자기 자신을 재참조하는 함수 
function fibonacci(n){
//재귀의 가장 중요한 첫번째는 무한루프에 빠지지 않게 탈출로를 만드는 것이다
//이것을 BASE CASE라고 한다
//fibonacci 함수에서 BASE CASE는 
//n이 2보다 작아질 경우 n값을 리턴하는 것이다
  if(n < 2){
    return n
  }
  
 //문제를 더 쪼갤 수 있는 경우는 RECURSIVE CASE라고 한다
 
  return fibonacci(n-1) + fibonacci(n-2)
}

fibonacci(6) //8
fibonacci(5) //5

//fibonacci 수열은 0 1 1 2 3 5 8 13...

fibonacci(4)를 입력받는 경우 3을 리턴하는데 이 때 재귀함수가 발동하는 경로는 이렇다 

fibonacci(4 - 1)  => fibonacci(3 - 1)  => fibonacci(2 - 1) 이때 BASE CASE가 동작하고

fibonacci(1)은 BASE CASE에 의해 1값을 리턴하게 된다. 이 리턴값을 가지고 다시 위로 올라가기 시작한다!

fibonacci(2) = fibonacci(1) + fibonacci(0)이기 때문에 fibonacci(2) = 1 값을 가지게 되고 다시 올라가서

fibonacci(3) = fibonacci(2) + fibonacci(1)이기 때문에 fibonacci(3) = 2 값을 가지게 된다. 마지막으로

fibonacci(4) = fibonacci(3) + fibonacci(2)고 fibonacci(4) = 3 값을 반환하게 된다

 

순열

  • 순서대로 뽑아서 줄을 세우는 것이다!
function test(arr){
  let result = [];
  
  //BASE CASE 배열의 길이가 1이 되면 멈춘다 
  if(arr.length === 1){
    result.push(arr)
  }else{
    for(let i = 0; i < arr.length; i++){
    //처음 숫자를 고정한다  
      let fixed = arr[i]
    //고정된 숫자를 제외한 나머지를 배열로 만든다
      let rest = [...arr.slice(0, i), ...arr.slice(i + 1)]
    //재귀로 다이브 위의 과정을 고정된 숫자를 제외한 배열을 가지고 다시 한 번 돌린다 
    //배열의 길이가 1이 되면 멈추고 그 값을 가지고 온다
      let perm = test(rest)
  	//고정된 숫자와 perm의 요소를 합친다 perm은 이중배열로 요소가 배열이다 
      let conc = perm.map(el => [fixed, ...el])
      result.push(...conc)
    }
  }
  return result
}

test([1,2,3]) 
//[
//  [ 1, 2, 3 ],
//  [ 1, 3, 2 ],
//  [ 2, 1, 3 ],
//  [ 2, 3, 1 ],
//  [ 3, 1, 2 ],
//  [ 3, 2, 1 ]
//]

'학습' 카테고리의 다른 글

create-react-app  (0) 2021.08.29
자료구조  (1) 2021.08.28
정규표현식(feat. replace)  (0) 2021.08.20
Object ↔ Array 변환  (0) 2021.08.20
React - props, state  (0) 2021.08.17