数据结构题集(严蔚敏)1.17求k阶斐波那契序列的第n项值的函数算法
2011-11-04 20:41
106 查看
已知k阶斐波那契序列的定义为
f(0)=0,f(1)=0,...f(k-2)=0,f(k-1)=1;
f(n)=f(n-1)+f(n-2)+...+f(n-k),n=k,k+1,...
试编写求k阶斐波那契序列的第n项值的函数算法,k和n均以值调用的形式在函数参数表中出现。
代码如下:
int fibonacci(int k,int n)
{
int *p,x,i,j;
if(k<1)
exit(OVERFLOW);
p=new int[k+1];
if(!p)
exit(OVERFLOW);
for(i=0;i<k+1;++i)
{
if(i<k-1)
p[i]=0;
else
p[i]=1;
}
for(i=k+1;i<=n;++i)
{
x=p[0];
for(j=0;j<k;++j)
p[j]=p[j+1];
p[k]=2*p[k-1]-x;
}
return p[k];
}这里用到了下面的推理:
[b]f(n)=f(n-1)+f(n-2)+...+f(n-k)=f(n-1)+f(n-1)-f(n-k-1)=2f(n-1)-f(n-k-1);[/b]
所以只需要求出第n-1项以及n-k-1项便能求出第n项,此算法时间复杂度为O( (n-k)k ),只需O(k)空间。
f(0)=0,f(1)=0,...f(k-2)=0,f(k-1)=1;
f(n)=f(n-1)+f(n-2)+...+f(n-k),n=k,k+1,...
试编写求k阶斐波那契序列的第n项值的函数算法,k和n均以值调用的形式在函数参数表中出现。
代码如下:
int fibonacci(int k,int n)
{
int *p,x,i,j;
if(k<1)
exit(OVERFLOW);
p=new int[k+1];
if(!p)
exit(OVERFLOW);
for(i=0;i<k+1;++i)
{
if(i<k-1)
p[i]=0;
else
p[i]=1;
}
for(i=k+1;i<=n;++i)
{
x=p[0];
for(j=0;j<k;++j)
p[j]=p[j+1];
p[k]=2*p[k-1]-x;
}
return p[k];
}这里用到了下面的推理:
[b]f(n)=f(n-1)+f(n-2)+...+f(n-k)=f(n-1)+f(n-1)-f(n-k-1)=2f(n-1)-f(n-k-1);[/b]
所以只需要求出第n-1项以及n-k-1项便能求出第n项,此算法时间复杂度为O( (n-k)k ),只需O(k)空间。
相关文章推荐
- 51nod 1126 求递推序列的第N项(斐波那契)
- 1.17 k阶斐波那契序列的第m项值的函数算法
- 泛型算法(一)之对序列的每个元素执行函数调用的算法
- 算法设计题1.17-绪论-第1章-《数据结构习题集》-严蔚敏吴伟民版
- 离散时间序列的内插算法(sinc 函数内插)
- 离散时间序列的内插算法(sinc 函数内插)
- 时间序列分解算法:STL
- 数据结构(严蔚敏)第二章部分算法设计题的实现
- 算法-最大子序列和
- php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
- 对数组进行排序、求最大值和求元素和的算法都编写为函数模板,采用相关数据进行测试。
- MATLAB时间序列的排序函数
- 斐波那契数列的第n项。
- 【php数组函数序列】之array_intersect() - 返回两个或多个数组的交集数组
- 最长上升子序列(LIS)算法…
- x264代码剖析(十一):核心算法之宏块分析函数x264_macroblock_analyse()
- 写正确函数需要注意的地方:两个序列a,b,大小都为n,序列元素的值为任意整数,无序;要求通过交换a,b中的元素,使序列a元素的和与序列b元素的和之间的差最小
- C - 求递推序列的第N项 51Nod - 1126【数学】
- 求递推序列的第N项
- 遗传算法与直接搜索工具箱学习笔记 五-----使用GPS算法寻找一个函数的最小值