【C语言】求斐波那契(Fibonacci)数列通项(递归法、非递归法)

原创 2016年05月30日 17:18:22

意大利的数学家列昂那多·斐波那契在1202年研究兔子产崽问题时发现了此数列.设一对大兔子每月生一对小兔子,每对新生兔在出生一个月后又下崽,假若兔子都不死亡.   问:一对兔子,一年能繁殖成多少对兔子?题中本质上有两类兔子:一类是能生殖的兔子,简称为大兔子;新生的兔子不能生殖,简称为小兔子;小兔子一个月就长成大兔子.求的是大兔子与小兔子的总和。


 月     份  ⅠⅡ  Ⅲ  Ⅳ  Ⅴ Ⅵ  Ⅶ  Ⅷ Ⅸ Ⅹ  Ⅺ  
大兔对数 
         13  21 34 55 89 144
小兔对数 
           13 21 34 55  89  到十二月时有大兔子144对,小兔子89对,共有兔子 144+89=233对从上表看出:

① 每月小兔对数=上月大兔对数。
②每月大兔对数等于上个月大兔对数与小兔对数之和.
 
     综合①②两点,我们就有:每月大兔对数等于前两个月大兔对数之和.


如果用 un 表示第 n 月的大兔对数,则有
un = un-1 + 
un-2,  n >2每月大兔对数un 排成数列为:1,1,2,3,5,8,13,21,34,55,89,144,        此数列称为斐波那契数列.


递归法:

使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1。

代码示例:

#include<iostream>
using namespace std;

long long Fib(int n)
{
    if (n == 0)
    {
        return 0;
    }
    else if (n == 1)
    {
        return 1;
    }
    else if(n > 1)
    {
        return Fib(n - 1) + Fib(n - 2);
    }
    //return n > 1 ? Fib(n - 1) + Fib(n - 2) : n; //条件运算符简单,一行代码即可
}

void Test()
{
    int N = 0;
    scanf("%d", &N);
    int ret = Fib(N);
    printf("%d\n", ret);
}

int main()
{
    Test();
    system("pause");
    return 0;
}

但是,递归法解决此问题并非高效,下面我们看看非递归法。



非递归法:

迭代实现是最高效的,时间复杂度是n*1 = 0(n),空间复杂度是0(1)。

#include<iostream>
using namespace std;

long long Fib(int n)
{
    if (n == 0)
    {
        return 0;
    }
    else if (n == 1)
    {
        return 1;
    }
    else if (n > 1)
    {
        int a = 1;
        int b = 1;
        int c = 1;
        for (int i = 2; i < n; i++)
        {
            c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
}

void Test()
{
    int N = 0;
    scanf("%d", &N);
    int ret = Fib(N);
    printf("%d\n", ret);
}

int main()
{
    Test();
    system("pause");
    return 0;
}


本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1755424

相关文章推荐

斐波那契数列的多种算法,迭代法+递归法+动态规划+矩阵幂

现在要求输入一个整数n,请你输出斐波那契数列的第n项。#include #include /** 现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n...

非递归法实现n皇后问题

  • 2015年11月17日 14:17
  • 718B
  • 下载

C++遍历本地文件(非递归法)

  • 2008年10月23日 20:05
  • 860B
  • 下载

递归法解决回式蛇形矩阵的输出(C语言的实现)

一、今天说的是哪种蛇形矩阵 蛇形矩阵有多种,今天说的是下面这种回形的蛇形矩阵。 如4x4的回形蛇形矩阵 如5x5的回形蛇形矩阵 通过分析发现,这种矩阵,在走一圈以后又变成一个小2个的矩阵,如5...

linux下c语言递归法查找文件,并打印绝对地址

c语言递归法查找指定目录下的文件或目录   本代码是个人学习过程中写下的小练笔,如果您发现问题,欢迎指正。 编译环境:linux+gcc, windows下尚未测试 #include #incl...

编程之美之求二叉树中节点的最大距离(递归和非递归法)

#include #include using namespace std; //************************************* //题目: // 求...

二叉树(4)非递归法遍历二叉树

首先递归法是操作二叉树的首选方法。非递归法ye

《剑指offer》非递归法判定二叉树是否是对称的

题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解析:该非递归法有点傻傻的,思想是利用队列进行层次遍历。然后翻转该二叉树,再层次遍历...

C语言-斐波那契(Fibonacci)数列三种不同求法时间复杂度分析

方法一 递归 提起斐波那契数列,首先想到的大概都是递归,但是其时间复杂度并非最优,其时间复杂度为O(2^N)。 方法二 循环 递归之所以效率低下,是因为需要重复的计算一些中间变量。而利用循环可以通过存...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C语言】求斐波那契(Fibonacci)数列通项(递归法、非递归法)
举报原因:
原因补充:

(最多只允许输入30个字)