【严蔚敏】【数据结构题集(C语言版)】1.17 求k阶斐波那契序列的第m项值的函数算法
已知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均以值调用的形式在函数参数表中出现。
k阶斐波那契序列定义:第k和k+1项为1,前k - 1项为0,从k项之后每一项都是前k项的和
如:k=2时,斐波那契序列为:0,1,1,2,3,5,...
k=3时,斐波那契序列为:0,0,1,1,2,4,7,13,...
算法一:数组法
判断m和k-1的大小,通过数组来存储斐波那契序列:
m<=k-1时,所有项均为0;
m>k-1时,前k-1项为0,k项之后的值通过循环和叠加依次写入数组,注意:数组中的下标从0开始;
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int E[100],f; //数列E用来存储斐波那契序列,f表示第m项的值 5 int Fibonacci(int k,int m){ 6 int i,j,sum; 7 if (m<=k-1) f=0; 8 else { 9 for(i=0;i<k-1;i++) 10 E[i]=0; //前k-1项为0 11 E[k-1]=1; //第k项为1 12 for(i=k;i<=m;i++){ //前k项的和 13 sum=0; 14 for(j=i-k;j<=i;j++) 15 sum +=E[j]; 16 E[i]=sum; 17 } 18 f=E[m-1]; //第m项 19 } 20 } 21 int main() { 22 int k,m; 23 scanf("%d%d",&k,&m); 24 Fibonacci(k,m); 25 printf("%d",f); 26 system("PAUSE"); //防止程序运行结束后编辑窗口关闭,此函数包含在stblib.h中 27 return 0; 28 }
方法二:递归法
由定义知递推公式:f(n)=f(n-1)+f(n-2)+...+f(n-k)
又:f(n-1)=f(n-2)+f(n-3)+...+f(n-k)+f(n-k-1) (n>k+1时成立)
由以上两式可得:f(n)=2f(n-1)-f(n-k-1) (n>k+1)
所以:
m<=k-1时,f(n)=0;
m=k,k+1时,f(n)=1;
m>k+1时,f(n)=2f(n-1)-f(n-k-1).
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int Fibonacci(int k,int m){ 5 if(m<=k-1) return 0; 6 else if((m==k)||(m==k+1)) return 1; 7 else return 2*Fibonacci(k,m-1)-Fibonacci(k,m-k-1); // m>k+1时,公式成立 8 } 9 int main(){ 10 int k,m; 11 scanf("%d%d",&k,&m); 12 printf("%d",Fibonacci(k,m)); 13 system("PAUSE"); 14 }