함수(콜백,재귀)

함수 function

보통 함수란 자신의 외부(재귀 함수의 경우 스스로) 코드가 '호출'할 수 있는 하위 프로그램입니다. 프로그램과 마찬가지로, 함수 역시 명령문의 시퀀스로 구성된 함수 본문을 가집니다. 함수에 값을 '전달'하면, 함수는 값을 '반환'할 것입니다.

함수가 기본 값 외의 원하는 값을 반환하도록 하려면 return 문으로 반환할 값을 지정해야 한다. 대신 반환문 없는 함수는 기본 값을 반환합니다

function add(a, b) {
    return a + b;
}

let result = add(10, 60);

console.log(result); //70

재귀함수 (recursive)

하나의 함수에서 자신을 다시 호출하여 작업을 수행하는 방식으로 주어진 문제를 푸는 방법이다. 재귀 호출이나 되부름이라고도 한다.

어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.
"재귀함수가 뭔가요?"
"잘 들어보게. 옛날옛날 한 산 꼭대기에 이 세상 모든 지식을 통달한 선인이 있었어. 마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지. 그의 답은 대부분 옳았다고 하네.
그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.
"재귀함수가 뭔가요?"
"잘 들어보게. 옛날옛날 한 산 꼭대기에 이 세상 모든 지식을 통달한 선인이 있었어. 마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지. 그의 답은 대부분 옳았다고 하네.
그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.
"재귀함수가 뭔가요?"
"잘 들어보게. 옛날옛날 ... "

출처: 나무위키

이런식으로 계속 되부름이 되는 것을 말하는다.


function recursive_add(num) {
    if (num == 0) return 0;
    return num + recursive_add(num - 1);
}

console.log(recursive_add(3));

// 3 + 2 + 1 = 6

console.log에 함수에 있는 num 값이 함수로 가고 그 num이 0이면 리턴값 0을 반환
0이 아니면 num값+ requsive_add(num-1)을 더한 값을 반환한다. 이걸 0이 될때까지
계속 계속 되부름하게 된다.

그림으로 만들어보자면 대충 이런 루틴을 타는거 같다. 노란색이 먼저 그리고 화살표가 하나 빠져 있지만 거기서 두번째 recurse로 값이 내려오고 계속 함수의 내용에 맞게 되부름하게 되는 형태

재귀함수 상세하게 factorial 구현 해보기


function factorial(3) {
    if (3 === 0)
        return 1;
    else {
        return x * factorial(3 - 1)
    }

}

let numb = 3;
let result1 = factorial(3);

function factorial(2) {
    if (2 === 0)
        return 1;
    else {
        return x * factorial(2 - 1);
    }
}
function factiorial(1) {
    if (1 === 0)
        return 1;
    else {
        return x * factorial(1 - 1);
    }
}

function factorial(0) {
    if (0 === 0)
        return 1;
    else {
        return x * factorial(1 - 1)
    }
} 
=

팩토리얼도 상세하게 풀어서 쓰면 이런식으로 3이 0이 아니기에 return x는 3이 되고, 곱하기 factorial(2)랑 곲하게 된다. 이 리턴값이 factorial(2)로 반환되고 계속 반환되고 이러면 factorial(0) 까지 오게 된다.

콜백함수

콜백함수(Callback Function)란 파라미터로 함수를 전달받아,
함수의 내부에서 실행하는 함수이다.

예를 들어 계산기를 만들었다고 치면.


function add(x,y){
    return x+y;
}
function sub(x,y){
    return x-y;
}

function mul(x,y){
    return x*y;
}
function div(x,y){
    return x/y;
}

function calculator(callback,x,y){
    return callback(x,y)
}

console.log(calculator(add,5,5));

console.log(calculator(sub,5,5));

console.log(calculator(mul,5,5));

console.log(calculator(div,5,5));

callback, 즉 add,sub,mul,div 인자가 되어 위에 함수 4개를 호출하게 되는 방식이다.
함수를 호출한다... 호출할땐 어떻게 호출을 하게 될까

call by

값에 의한 호출참조에 의한 호출 이 두가지가 있다.

1.call by value
값에 의한 복사로 함수 내에서 매개변수값을 변경시켜도 영향이 미치지 않는다.
원시타입을 매개 변수로 넘겼을때 발생한다.

  1. Call by reference
    주소에 대한 복사로 함수 내에서 매개 변수 내 값을 변경시키면 원본 데이터에도 영향을 받는다.객체 타입(Object Type)을 매개 변수로 넘겼을때 발생한다.

이렇게 가볍게 재귀함수,콜백함수에 대해서 공부해보고 배워봤다.

공부 후기

제로베이스에서 제공된 강의만 보고 표면적인 부분만 알게 되었지만
정확하게 어떻게 되는지 좀 더 공부해봐야할 필요가 있다고 판단되었다.
조금 더 공부해서 보충해서 이 글을 작성하고 싶다.

좋은 웹페이지 즐겨찾기