已知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上检验的结果图:
相关链接:
斐波那契数列算法分析 - InfantSorrow - 博客园 (推荐)
CSDN-k阶斐波那契序列问题 [问题点数:10分,结帖人py330316117]