재귀함수

수민·2023년 2월 5일
0

front2

목록 보기
1/5
  • 함수 스스로 자신을 참조해 호출하면서 동일한 코드가 계속적으로 수행되는 함수 호출 방법
  • 재귀 함수는 특정 조건이 됐을 때 자신을 그만 호출되도록 제한하는 exit code가 필요

함수가 자신을 다시 호출하는 구조로 만들어진 함수이다. 재귀함수는 종료조건이 있어야 하며, 종료조건을 설정해주지 않으면 무한 반복을 하게된다. 재귀함수로 작성이 되는 코드는 반복문으로도 작성할 수 있다.


	function recurse(){
      
      //function code
      recurse();
    }

rcurse()



function f(n) {
    if (n <= 1) {
       return 1 // 종료 조건
    }
    return n + f(n-1) // 재귀함수
}
console.log(f(100)) //5050
// 재귀함수
// 순번   f(n)   n      return       최종
// 1   f(100)  100  100 + f(99)  100+99+98+97+96+95+94..+2+1   
// 2   f(99)   99   99 + f(98)   99+98+97+96+95+94..+2+1 
// 3   f(98)   98   98 + f(97)   98+97+96+95+94..+2+1 
// 4   f(97)   97   97 + f(96)   97+96+95+94..+2+1 
// ...
// 2   f(2)    2    2 + f(1)    2+1
// 1  f(1)    1    1 // return값이 자기 자신을 호출하지 않는 상황

여기서 사용된 for문 조건은 1부터 순회한다. 재귀함수의 경우는 100부터 순회한 다음 호출 스택에 쌓여 있는 값을 처리해 나가게 되는데 스택은 LIFO방식이기 때문에 이때 스택에 제일 마지막으로 반환된 1부터 100까지 순차적으로 더해서 값을 반환하게 된다. 곱하기 방식도 위와 같다.

2진수 변환하기

반복문



let result = '';
let x = 11
while (true) {
    if (x%2 == 0) {
        result += '0'; // result = '0' + result;
    } else {
        result += '1'; // result = '1' + result;
    }
    x = Math.floor(x / 2 );
    // Math.ceil() : 소수점 올림
    // Math.floor() : 소수점 버림
    // Math.round() : 소수점 반올림
    if (x == 1 || x == 0) {
        result += String(x); //result = String(x) + result;
        break;
    }
}
console.log(result.split('').reverse().join('')); //1011

재귀함수


function binary(num) {
    if (num == 1 || num == 0) {
        return String(num) //종료조건
    }
    return binary(Math.floor(num/2)) + String(num % 2)
}
console.log(binary(11)); // 1011
// binary(숫자)  binary(Math.floor(num/2)) + String(num % 2)
// binary(11)  binary(11/2) + String(11%2) \ 101 + String(1) -> 1011  
// binary(5)   binary(5/2) + String(5%2) \ 10 + String(1) -> 101
// binary(2)   binary(2/2) + String(2%2) \ 1 + String(0) -> 10
// binary(1)   1 // if문 조건에 해당
// 더하는 순서에 따라 값이 달라질 수 있다. 

숫자와 문자열 더하기는 문자열이 우선시 된다. 그래서 위와 같이 더하게 되면 문자열이 연결된다.

profile
헬창목표

0개의 댓글