【嚴蔚敏】【數據結構題集(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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM