ktpd 发表于 2016-11-12 18:27

实现斐波那契数列的三种方法

本帖最后由 ktpd 于 2016-11-12 18:33 编辑

斐波那契数列又称黄金分割数列。它的特点是从第3个数开始,每一个数都等于前面两个数相加。例:0   1   1   2   3   5   8   13   21.。。。。。从上我们可以总结出以下规律:                  http://img.blog.csdn.net/20160906170209769?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center当n =0时; F(n) = 0;当n = 1时; F(n) = 1;当n > 1时;F(n) = F(n-1)+F(n-2);
那我们如何求出这个数列中第n个数是多少呢?
(一)以指针实现斐波那契数列
#include<iostream>
#include<cassert>
using namespace std;
/*
时间复杂度:O(N)
空间复杂度:0(N)
*/
long long Fib(long longn)//当n = 30时,斐波那契数已经很大了,所以我们把类型定义为long long
{
        assert(n >= 0);//n必须大于0
        if(n==0||n==1)
        {
                return n;
        }
        // 建立一个指针,并为该指针开辟空间
        //因为数列最开始有一个0,所以当我们求第n个数的时候,需要多开劈一个空间
        long long *p = new long long;
        p = 0;
        p = 1;
        for(int i = 2;i < n+1; i++)
        {
                //从下标为2的数开始,每个数都等于它前面两个数相加
                p = p+p;
        }
        //返回要找的第n个数
        return p;
}


(二)交替相加法(我自己起的名字)建立一个first变量,一个second变量,一个third变量。third = first + second。每加完一次,都把first的值置成second,把second置成third。得到新的两个变量,然后求取新的third。
/*
时间复杂度:O(N)
空间复杂度:0(1)
*/
//省略了头文件,全局命名空间
long long Fib(long longn)
{
        assert(n >= 0);
        if(n==0||n==1)
        {
                return n;
        }
        long long first = 0;
        long long second = 1;
        long long third = 0;
        for(int i = 2;i<=n;i++)
        {
                third = first+second;
                first = second;//将second的值赋给first
                second = third;//将third的值赋给second
        }
        return third;
}
(三)递归算法
这三个算法中,递归可谓是最简单的也是最难理解的。我们先看代码:
/*
时间复杂度:O(2^N)
空间复杂度:O(N)
*/
//省略了头文件,全局命名空间
long long Fib(long longn)
{
        assert(n>=0);
        if(n == 1||n == 0)
        {
                return n;
        }
        return Fib(n-1)+Fib(n-2);
}

这个递归的终止条件是 n==1 或 n == 2 。
当我们传进去的n大于这两个数的时候,这个程序对执行
[*]
return Fib(n-1)+Fib(n-2);

递归进入下一层,直到满足终止条件。再一层一层返回。最后返回我们想要的值。

dxdeng 发表于 2016-11-12 19:00

挺复杂的东西呢

CrestKing 发表于 2016-11-12 19:30

这个我上竞赛培优的时候算过,特征根方程就ok了

卷翼 发表于 2016-11-12 20:54

楼主学c++的?一起交流学习啊,感觉第二种方法最好,递归最差
页: [1]
查看完整版本: 实现斐波那契数列的三种方法