我想问下Fibonacci数列的下面这段c++高效算法的理解?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我想问下Fibonacci数列的下面这段c++高效算法的理解?相关的知识,希望对你有一定的参考价值。

#include<iostream>
#include<ctime>
using namespace std;

int Fibonacci(int x,int *t)//x的起点从0开始
if(t[x]!=0) return t[x];
t[x]=Fibonacci(x-1,t)+Fibonacci(x-2,t);
return t[x];


int main()
int n;
clock_t b,e;
int *t;
while(cin>>n)
b=clock();
t=new int[n+2];
memset(t,0,(n+2)*4);
t[0]=t[1]=1;
int ans=Fibonacci(n,t);
delete t;
e=clock();
cout<<"time: "<<e-b<<"ms. anwser: "<<ans<<endl;

return 0;
问题一:为什么他要申请n+2个大小的数组空间啊,不是只要n+1就够了吗?
问题二:在函数定义那里,为什么是t[x]!=0 返回t【x】,然后下面再写t【x】=Fibonacci(x-1,t)+Fibonacci(x-2,t); 这样的话如果要求t【2】的话,不是直接返回t【x】吗?可是这时候t【2】值都没有求出来,怎么样返回值呢???

(1)只要n+1就够
(2)memset(t,0,(n+2)*4); 此句将t数值各元素全部清零,x≥2时 t[x]初始值全为0
t[x]!=0 表示已经计算过 ,可直接返回

t[x]==0 表示没有计算过,需要调递推过程

(3)本段程序算仅能计算前40个Fibonacci数,因为第40个Fibonacci已超过了C++整数能表示的范围。
参考技术A 你这算法是从哪来的啊?一点都不高效。
这个就是递归,会占用大量资源。
其实如果你想得到Fibonacci数列每个位置的值的话,从前往后推更好
t[0]=1;
t[1]=1;
for (int i=2; i<n; i++)
t[i]=t[i-1] + t[i-2];
参考技术B 表示我也觉得n+1的空间够了,不知多的那个目的为何……
关于问题二,这就是这个程序的高效所在了,这是一种可以被称作是动态规划的思想。
你说求t[2]的时候,此时没有值,那么数组初始化后t[2]应该初始化为0。然后递归调用下面的t[x]=Fibonacci(x-1,t)+Fibonacci(x-2,t);才能算t[2]。
而斐波拉切数列的普通的递归算法的问题在于,有很多相同的调用需要重复计算多次,比如要求f(5)时,f(5) = f(4) + f(3),而递归时f(4) = f(3) + f(2),又要再算一次f(3)了。这个程序高效在,当计算过一个f(n)的值后,会将其储存在数组t中,从而下次递归时再要用到这个f(n)时,就可以直接取出而不需要再次递归了。
参考技术C 问题一.. n+1真心够了已经..
问题二.. 如果t[x]!=0 .表示我已经通过递归计算计算到了所需要的值.返回这个值.如果没有.那么我用前两个数字相加产生这个数.然后继续进行循环.一开始整个t每个值都是0.因为经过了memset

C++项目参考解答:求Fibonacci数列

【项目:求Fibonacci数列】

  Fibonacci数列在计算科学、经济学等领域中广泛使用,其特点是:第一、二个数是1,从第3个数开始,每个数是其前两个数之和。据此,这个数列为:1 1 2 3 5 8 13 21 34 55 89 ……,请设计程序,输出这个数列,直到这个数字超过10000。
  【提示】数列可以表示为:

{f1=f2=1fn=fn?1+fn?2,n>2

【参考解答】

#include <iostream>
using namespace std;
int main( )
{
    int f1,f2,fn,n;
    f1=f2=1;
    n=2;
    cout<<f1<<‘\t‘<<f2<<‘\t‘;
    fn=f1+f2;
    while(fn<10000)
    {
        cout<<fn<<‘\t‘;
        n++;
        if(n%5==0)
            cout<<endl;
        f1=f2;
        f2=fn;
        fn=f1+f2;
    }
    return 0;
}

以上是关于我想问下Fibonacci数列的下面这段c++高效算法的理解?的主要内容,如果未能解决你的问题,请参考以下文章

Fibonacci数列高效解法大全及时间复杂度分析 连载【5】

用C++求fibonacci数

C++项目参考解答:求Fibonacci数列

Fibonacci数列问题 求解 谢谢了~没分可加了 。。

数论——Fibonacci数列(C++)

Fibonacci斐波那契数列 C++或go实现