【严蔚敏】【数据结构题集(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 }

 

posted on 2018-04-02 23:45  Pink.Pig  阅读(3270)  评论(0编辑  收藏  举报