已知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 }
