我想问下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】值都没有求出来,怎么样返回值呢???
(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。
【提示】数列可以表示为:
【参考解答】
#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++高效算法的理解?的主要内容,如果未能解决你的问题,请参考以下文章