순환형태의 fib함수 질문

na4980의 이미지

int fib(int n)
{
printf("fib(%d) is called.\n", n);
if(n==0) return 0;
if(n==1) return 1;
return (fib(n-1) + fib(n-2));

이 코드의 출력 결과가 이렇게 나오는데요.. 어떠한 과정으로 출력이 되는건지 이해가 안됩니다. 설명해주실 수 있나요?

fib(6) is called
fib(5) is called
fib(4) is called
fib(3) is called
fib(2) is called
fib(1) is called
fib(0) is called
fib(1) is called
fib(2) is called
fib(1) is called
fib(0) is called
fib(3) is called
fib(2) is called
fib(1) is called
fib(0) is called
fib(1) is called
fib(4) is called
fib(3) is called
fib(2) is called
fib(1) is called
fib(0) is called
fib(1) is called
fib(2) is called
fib(1) is called
fib(0) is called

raymundo의 이미지

콜론 앞의 숫자가 호출되는 순서입니다.

                                       1: fib(6)
                               2: fib(5)    +     17: fib(4)
                          3: fib(4) + 12: fib(3)
                     4: fib(3) + 9: fib(2)   |
                5: fib(2) + 8: fib(1) |      |
           6: fib(1) + 7: fib(0)      |      +-------+
                                      |              |
                           10: fib(1) + 11: fib(0)   |
                                                     |
                                          13: fib(2) + 16: fib(1)
                                     14: fib(1) + 15: fib(0)

17: fib(4)부터는 생략했습니다 :-)

좋은 하루 되세요!

oosap의 이미지

멋진 그림입니다!

전위순회인가요?
학부 수업 기억이 나네요.. 피보나치도 트리구조였군요..

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

익명 사용자의 이미지

깊이 우선 탐색입니다.

oosap의 이미지

전위 순회는 깊이 우선 순회(depth-first traversal)라고도 한다.

전위순회와 깊이우선탐색이 다른가요?

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

minspapa의 이미지

오.......

익명 사용자의 이미지

저도 초보 개발자인데요
출력결과랑 자기생각이랑 다를땐 처음 함수부터 하나씩
따라가면서 적어보세요
return 할때 (fib(n-1) + fib(n-2)); 이부분이니
처음에 6을 넣으셧을테고 fib(5) + fib(4) 가 리턴이 되겟죠
근데 재귀적방법으로 하셧고 쓰레드나 이런걸로 하지 않으셧으니 분명 순서대로 함수가 실행이 됩니다.
fib(5) 는 리턴하면서 fib(4) + fib(3) 을 리턴을 하면
한단계지낫을때 맨처음 fib(6) 에서의 리턴문장이
fib(6) is called fib(5) is called 가 출력이 되고
return (fib(4) + fib(3)) + fib(4); 가 됩니다.
이걸 계속 따라가시다보면 출력결과가 저렇게 나오는 이유를 아시겟죠? ㅋㅋ
화이팅이요!!

na4980의 이미지

설명들을 잘해주셔서 잘 이해했습니다~ 감사합니다^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.