happy cat image

everdevel

우리 모두의 웹 입문, 에버디벨

UI 변경
오늘도 방문해 주셔서 감사합니다.
여러분이 매일 찾아주셔서 하루 5명 오는 사이트에서 1000명이 오는 사이트로 커갈 수 있었습니다.
드디어 2017년 8월 25일 에버디벨 책이 [웹코딩 시작하기]라는 제목으로 정말 출간 합니다.
정말 열심히 최선을 다해 많은 조사를 하며 작성했습니다. ^-^*
에버디벨은 제가 프로그래머가 아닌 시절 만든 사이트지만, [웹코딩 시작하기]는 저의 2년간의 프로그래머 경력을
살려서 꼭 알아야 한다고 생각하는 것들을 최대한 쉽게 설명하여 만들었습니다.
[웹코딩 시작하기]서평 이벤트도 시작했습니다.
[웹코딩 시작하기 서평 이벤트 많은 참여 부탁드립니다. ^-^* 눌러주세요.]

- 2017.8.5 에버디벨 운영자

재귀 함수

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

즉, 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>

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

강좌로 돌아가기