已知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阶裴波那契序列的第m项值的函数算法,
k和m均以值调用的形式在函数参数表中出现。要求实现下列函数:
Status Fibonacci(int k, int m, int &f);
/* 如果能求得k阶斐波那契序列的第m项的值f,则返回OK;*/
/* 否则(比如,参数k和m不合理)返回ERROR */
k阶斐波那契序列的性质有:
1、k为大于等于2的整数;
2、前k-1个数为0;
3、第k个数为1;
4、从第k+1个数起,每个数都是其前k个数之和。
例如:k = 2时,{0,1,1,2,3,5,8,13,……};k = 3时,{0,0,1,1,2,4,7,13,24,44,……};k = 4时,{0,0,0,1,1,2,4,8,15,29,56,108,……}。
一,下面这段代码,用了一次while循环初始化数值和一次for循环计算,严格来讲是用了两个循环,但其时间复杂度为O(m)。
Status Fibonacci(int k, int m, int &f)
/* 求k阶斐波那契序列的第m项的值f */
{
//判断参数合理性
if(k<2||m<0) return ERROR;
//当 m < k 时
if(m < k)
{
if(m == k-1)
{
f = 1;
return OK;
}
else
{
f = 0;
return OK;
}
}
int *p, *q, i, n;
//n为操作空间大小
n = k + 1;
//动态创建k+1个空间为操作空间
p = q = (int *)malloc(n * sizeof(int));
//初始化前k+1个值,即前k-1个值为0,第k和k+1个值为1
q[k-1] = 1;
q[k] = 1;
while(*q != 1)
{
*q++ = 0;
}
//使用模n法在n个空间内形成循环操作,此处不用k个空间是因为
//求第i个值时,要用到第i-k-1个数的值,需要k+1个空间
//第i个数的值等于两倍第i-1个数的值减去第i-k-1个数的值
for(i = n; i <= m; i++)
{
p[i%n] = 2*p[(i-1)%n] - p[(i-k-1)%n];
}
f = p[(m)%n];
return OK;
二,递归。
#include <stdio.h>
#include <stdlib.h>
int Fibonacci(int k, int m)
{
if(m<k-1) return 0;
else if(m==k-1) return 1;
else
{
int i;
int fm=0;
for(i=m-1;i>=(m-k);i--)
fm += Fibonacci(k, i);
return fm;
}
}
void main()
{
int k, m, fm;
printf("输入k: ");
scanf("%d", &k);
printf("输入m: ");
scanf("%d", &m);
fm = Fibonacci(k, m);
printf("%d阶裴波那契数列的第%d项值f(%d) = %d\n", k, m, m, fm);
}
测验图:
三,利用数组。
Status Fibonacci(int k, int m, int &f)
/* 求k阶斐波那契序列的第m项的值f */
{
int t[60],sum,i,j;
if(k<2||m<0) return ERROR; /*参数k和m不合理*/
if(m<k-1) f=0;
else if(m==k-1) f=1;
else
{
for(i=0;i<=k-2;i++)
t[i]=0; t[k-1]=1;
for(i=k;i<=m;i++) //按定义更直观
{
sum=0;
for(j=i-k;j<=i;j++)
sum+=t[j];
t[i]=sum;
}
f=t[m];
}
return OK;
}
Anyview上检验的结果图:
相关链接:
求k阶裴波那契序列的第m项值的函数算法
斐波那契数列算法分析 - InfantSorrow - 博客园 (推荐)
CSDN-k阶斐波那契序列问题 [问题点数:10分,结帖人py330316117]