【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

Fibonacci数列第N项的两种计算方法比较

一、斐波那契数列(Fibonacci Sequence)的定义        斐波那契数列的发明者,是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci,生于公元1170年,卒...
  • thomashtq
  • thomashtq
  • 2015年04月13日 11:32
  • 1159

Fibonacci数列通项公式推导

前段时间很多人问道Fibonacci数列的通向公式是怎样推导出来的,下面给出一个朴素的初等方法。 方法说穿了,就是凑成等比数列的形式,知道了大概的方向,推导出来就不难了,只是当初想出这个方法的人值得膜...
  • u011686226
  • u011686226
  • 2015年04月04日 16:12
  • 506

求Fibonacci数列的第n项

1,1,2,3,5…..好熟悉的斐波拉契数列,请输出斐波拉契数列的第n项。 输入格式 一个数 n 输出格式 一个数 斐波拉契数列的第n项 ,答案摸10000007; 输入样例 4 输出样例 3 数据...
  • ouqingliang
  • ouqingliang
  • 2016年08月18日 09:32
  • 321

递归转非递归学习二:求斐波那契数列F(N)的值

上《数据结构》的网络课程学习了递归转非递归的机械式转换的方法之后, 先练习写了N的阶乘方法转非递归(模拟栈)的代码,然后试着将斐波那契数列求F(N)的值的过程(模拟栈)转化为非递归: #include...
  • xunmengpiaoyun
  • xunmengpiaoyun
  • 2013年11月28日 18:06
  • 1030

java 输入一个整数n,根据n获取Fibonacci数列的第n个值

数学基础: 1,1,2,3,5,8,13 and so on 前两位特殊,其余各位符合F(n) = F(n-1)+F(n-2);  首先想到递归,如下: public static i...
  • moyinghui
  • moyinghui
  • 2016年12月12日 19:22
  • 1437

顺序表应用7:最大子段和之分治递归法

顺序表应用7:最大子段和之分治递归法 Time Limit: 10MS Memory Limit: 400KB Submit Statistic Problem Descriptio...
  • qq_33362864
  • qq_33362864
  • 2016年09月21日 21:11
  • 902

Fibonacci(斐波那契)数列的递归与非递归实现 python

关于递归算法,可以参考这篇文章 汉诺塔 经典递归算法 in python Fibonacci数列为:0、1、1、2、3、5、8、13、21...... 数列第一项为0,第二项为1,从第三项开始,每...
  • u014496330
  • u014496330
  • 2015年03月26日 15:48
  • 4020

Fibonacci 数列及其计算方法

Fibonacci 数列及其计算方法斐波那契数列(Fibonacci sequence),又称黄金分割数列,这个数列最早是由印度数学家提出来的。不过更多的人学习到这个数列是因为意大利数学家列昂纳多·斐...
  • liyuanbhu
  • liyuanbhu
  • 2016年06月17日 23:02
  • 7557

求Fibonacci数的三种方法和时间复杂度解析

求Fibonacci数最快的方法,时间复杂度O(log n)
  • deping_chen
  • deping_chen
  • 2014年05月11日 12:58
  • 3178

基本算法分类与原理

基本算法根据时间复杂度,空间复杂度大致可以分为下面几种:穷举法,迭代法,递推法,递归法,分治法,贪心法,回溯法,动态规划以及分支定界。...
  • Canhui_WANG
  • Canhui_WANG
  • 2016年02月29日 15:22
  • 562
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C语言】求斐波那契(Fibonacci)数列通项(递归法、非递归法)
举报原因:
原因补充:

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