递归调用流程的解释?

时间:2013-12-30 08:53:22

标签: c recursion fibonacci

#include <stdio.h>

int fibonaci(int i)
{
   if(i == 0)
   {
      return 0;
   }
   if(i == 1)
   {
      return 1;
   }
   return fibonaci(i-1) + fibonaci(i-2);
}



int  main()
{
    int i;
    for (i = 0; i < 10; i++)
    {
       printf("%d\t", fibonaci(i));
    }
    return 0;
}

我已经读过这个函数表示二叉树。为什么会这样?我浏览了所有相关答案,但都没有提供适当的解释。任何有关递归的帮助文档都将受到高度赞赏。如果可能的话,给我一些超链接。我会对我非常有帮助。

2 个答案:

答案 0 :(得分:0)

调用自身的函数称为recursive function,调用函数本身的过程在C编程中称为recursion。这里fibonaci(i)被称为10次。

fibonacci series是这样的:1, 1, 2, 3, 5, 8, 13, 21, 34

从0和1开始,系列中的每个新数字都只是前面两个数字的总和。

if(i == 0)
   {
      return 0;
   }
   if(i == 1)
   {
      return 1;  //returns 1 if i=1
   }
   return fibonaci(i-1) + fibonaci(i-2);  // if it is 2 or greater than 2

mathematical terms中,Fibonacci数的序列Fn由递归关系定义

  F_n = F_{n-1} + F_{n-2}

有种子值

 F_0 = 0 \quad\text{and}\quad F_1 = 1.

写一个返回F_n的函数int fib(int n)。例如,如果n = 0,则fib()应该返回0.如果n = 1,则它应该返回1.对于n> 1。 1,它应该返回F_{n-1} + F_{n-2}

答案 1 :(得分:0)

  

你能告诉我为什么它被称为二叉树吗?

程序中的函数执行顺序可以描述为树,例如。克。

program()
{
    input(x);
    proc(x);
    output(x);
}

对应树

         program()
        /    |    \ 
input(x)  proc(x)  output(x)

大小(节点数)4和高度1(假设输入,proc和输出是叶函数)。

现在,如果函数以及从它调用的每个函数最多执行两个函数调用(与fibonaci()一样),则相应的图形是二叉树,因为每个节点最多有两个儿童。以调用fibonaci(5)开头的树的示例,然后缩写为f

                   fibonaci(5)
                 /             \
            f(4)                 f(3)
           /    \                /  \
      f(3)        f(2)        f(2)  f(1)
      /  \        /  \        /  \
   f(2)  f(1)  f(1)  f(0)  f(1)  f(0)
   /  \
f(1)  f(0)