递归函数__斐波拉契数列__

2017-09-17 22:41:44

递归

    ____函数自己调用自己,又可以理解为自己的事情自己做。

   如果觉得难以理解,可以把理解成这个函数调用了一个函数,只是这个函数和自己长得一模一样。

---------------------------------------------------------------------------------------

    拿一对刚出生的小兔子编故事。

    假设,一对刚出生的小兔子,第一个月没有繁殖能力,两个月后生下一对兔子。

    假设所有的兔子都不死,那么10后有多少兔子?

所经历的月数                    1           2            3           4          5           6           7             8               9              10

兔子对数         1      1      2      3     5      8     13    21     34      55

---------------------------------------------------------------------------------------

 

很明显,相邻两项之和 构成了后一项。

#include <stdio.h>

int FBArray(int i)
{//FBArray(1)    FBArray(2)    FBArray(3)    FBArray(4)    FBArray(5)
 //    1              1            2             3             5     
    if(i < 2)
    {
        return (i == 0)? 0 : 1;
    }
    return FBArray(i-1) + FBArray(i-2);
}

int main()
{
    printf("\n");
    int i;
    for(i = 1 ; i <= 40 ; i++)
    {//打印40个月兔子的数量变化
        printf("%d\n",FBArray(i));
    }  
    printf("\n");
    
    return 0;
}

 如果考虑算法复杂度的的话,还是以下代码更优

//斐波那契数列查找算法,求斐波那契数列第n项
#include<stdio.h>
unsigned long long FBArray(unsigned int n); 
int main(void)
{
    int n;
    scanf("%d" , &n);
    printf("%llu\n" , FBArray(n));
    return 0;
}
unsigned long long FBArray(unsigned int n)
{
    int i , fibone , fibtwo , fibthree;
    int fi[2] = {0 , 1};
    fibone = 0;
    fibtwo = 1;
    
    if(n < 2)
    {
        return fi[n];
    }
    else
    {
        for(i = 2;i <= n;i++)
        {
            fibthree = fibone + fibtwo;
            fibtwo = fibone;
            fibone = fibthree;
        }
        return fibthree;
    }
}

 

posted @ 2017-09-17 22:34  耶梦加德  阅读(578)  评论(1编辑  收藏  举报