happy cat image

everdevel

Web Technology, 에버디벨

UI 변경

EEOS

에버디벨 책을 학습할 수 있는 클라우드 개발 환경을 제공합니다.
개발환경구축없이 태블릿에서도 개발할 수 있는 책의 예제와 프로젝트
오직 당신을 위한 스토리지, URL, DB, 무제한 트래픽
그리고 웹기반 개발환경을 제공합니다.

더 알아보기

웹애플리케이션을 만들고 싶은데 이것도 알아야 하고
저것도 알아야 한다는데 어떻게 해야할지 모르겠다면

웹프로그래밍 초보자를 넘어 프로그래밍을 처음 접하는 분들을 위해
에버디벨이 1년넘게 작업한

HTML5 + CSS3 + jQuery + MySQL + PHP

한권으로 배우는 웹코딩 시작하기

재귀 함수

재귀 함수는 단어를 보고 어렵게 느끼실수도 있는데요 함수 안에서 자신의 함수를 호출 하는 것을 말한답니다.

즉, add라는 함수를 만들었다면 add라는 함수 안에 add라는 함수를 호출 하는것입니다.

또 한번 즉,

function add(){
  add();
}

위와 같은거죠. ^^

이 예문은 수학에 나오는 팩토리얼을 예문으로 들어서 설명해 보겠습니다.

갑자기 수학 나오니까 머리 아프신 분들 계실수도 있습니다.

나 팩토리얼이 뭔지 모르니까 이 강좌 못보겠다. 나가야지 하시는 분도 계실수도 있습니다.

걱정마세요.

팩토리얼이란?

자기 자신의 수에 1 작은 수를 곱하고 또 1작은 수를 곱하고 해서 1작은 수가 1이 될때까지 곱하는 것입니다.

어떤 수를 예를 들어서 5라고 합시다.

설명이 이상할 수 있으니 예를 든다면요.

5x4x3x2x1 입니다.

이것이 팩토리얼(!) 이라고 합니다. 기호는 ! 입니다.

5! 이렇게 작성을 하며, 5!를 풀어라 한다면 5*4*3*2*1 이므로 120이 답입니다.

이렇게 해서 팩토리얼이 무엇인지 알게되었습니다.

그렇다면 10! 이것은 무엇일까요?

10*9*8*7*6*5*4*3*2*1 계산 하면 됩니다. ^-^* 답은 4,939,200 입니다.

그럼 함수 안에 자신의 함수를 호출하는 재귀함수에 대해서 알아 볼까요

그런데 이 재귀함수는 제가 제대로 이해를 하고 설명하는 것인지 좀 헤깔리지만 마땅히 흐름도가 표시된 자료도 찾기 힘들어서 제가 이해한 대로 설명을 해보겠습니다.

소스는 다음과 같습니다.

재귀 함수를 아래의 소스로 이해해 봅시다.

function factorial(fnum){
  end_num = 1;
  if(fnum == end_num) return end_num;
  else return fnum*factorial(fnum-1);
}
document.write(factorial(3));

함수 호출

document.write(factorial(3));

함수 호출은 출력문과 함께 매개변수 3을 보내고 있습니다.

factroial함수는 매개변수로 3을 받습니다.

function factorial(fnum){
  end_num = 1;
  if(fnum == end_num) return end_num;
  else return fnum*factorial(fnum-1);
}
document.write(factorial(3));

factroial 의 매개변수인 fnum은 3을 값으로 갖습니다. 그러므로 fnum=3인 상태 입니다.

end_num = 1이 있는 이유는

end_num = 1;

팩토리얼은 자신의 수가 1일 될때까지 곱셈을 합니다. 그러므로 끝나는 수가 1이기 때문에 end_num=1을 선언 합니다.

fnum 과 end_num의 값이 같다면

if(fnum == end_num) return end_num;

end_num값은 1이고 fnum은 3입니다. fnum값이 1이된다면 end_num값을 반환 하라는 내용입니다.

fnum이 end_num과 같지 않을 경우는

else return fnum*factorial(fnum-1);

fnum*factroial(fnum-1)을 반환합니다. fnum이 3이라고 한다면,

3*factorial(2) 를 반환 하는것입니다. 그럼 이 부분은 함수 호출 부분으로 넘어가겠죠?

그런데 값을 넘겨 받았지만 호출문인 factroial(2)가 있기 때문에 함수는 호출 되어 2를 매개변수의 값으로 하고 else문을 만나서 2*factorial(1)을 반환하게 됩니다.

그렇다면 호출문인 factorial(3)은 3*2*factorial(1)인 상태가 됩니다. factorial(1)은 호출되어 end_num값과 같아서 1을 반환하게 되고

호출문은 3*2*1을 출력값으로 받게 되는 것입니다. 이해가 잘 되시는지요? ^^

잘 안되실것 같아서 다시 한번 설명을 해보겠습니다.

함수호출 factorial(3)을 실행

fnum값이 3이 되고 else문에 의해서 3*factorial(2)를 반환

3*factorial(2)에서 factorial(2)는 함수 호출 하고 매개변수값이 2이므로, else문을 만나서 2*factrorial(1)을 반환하고 1을 매개변수 값으로 해서 호출하고

end_num과 fnum이 일치하므로 if문을 만나서 1을 반환,

함수는 3*2*1을 반환하게 됩니다. ^^

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>자바스크립트</title>
<script>
function factorial(fnum){
  end_num = 1;
  if(fnum==end_num) return end_num;
  else return fnum*factorial(fnum-1);
}
document.write("!="+factorial(3));
</script>
</head>
<body>
</body>
</html>

이것으로 재귀함수에 대한 설명을 마치겠습니다. ^^

강좌로 돌아가기