1. 程式人生 > >【資料結構】求K階斐波那契數列

【資料結構】求K階斐波那契數列

K階斐波那契數列:數列第1項到第k-1項為0,第k項為1,之後從第(k+1)項開始每一項為前k項之和。

要求 :
編寫求k階斐波那契序列中前n+1項(f1,f2,…,fn)的演算法,要求滿足fn .max,而fn +1>max,max為某個約定的常數,注意:本題所用迴圈佇列的容量為k,演算法結束時,留在佇列中的元素為所求k階斐波那契序列中的最後k項。

思路:利用迴圈佇列(令佇列的長度為k)

  1. 輸入數列的前k項,依次入隊,
  2. 隊首元素出隊並輸出
  3. t入隊(t初始值為1)
  4. 對佇列中所有元素求和為t
  5. 若t<=max執行步驟2
  6. 輸出佇列中餘下的元素

程式碼如下

void Fibonacci(int
k,int max) { Queue *q; int i, item, t = 1,j = 0; q = CreateQueue(k); for(i = 0; i<k; i++) if(i == k-1) AddQ(q,1); else AddQ(q,0); while(t <= max){ j++; printf("%d ",DeleteQ(q)); AddQ(q,t); t = 0; for
(i = 0; i<k; i++){ item = DeleteQ(q); t += item; AddQ(q,item); } } for(i = 0; i<k; i++){ item = DeleteQ(q); printf("%d ", item); AddQ(q,item); } }

上述函式中佇列的相關操作如下
注:這裡的佇列根據要求做了一些修改,陣列Date沒有事先給定大小,而是以指標形式給出,這樣方便根據數列的階數k來改變陣列大小

typedef struct{
    int *Date;
    int front;
    int rear;
    int K;
} Queue;
Queue* CreateQueue(int k){
    Queue *Q;
    Q = (Queue*)malloc(sizeof(Queue));
    Q->K = k + 1;
    Q->Date = (int*)malloc(sizeof(int)*Q->K);
    Q->front = Q->rear = 0;
    return Q;
}
void AddQ(Queue *Q, int item)
{
    if((Q->rear+1)%Q->K == Q->front){
        return;
    }
    else{
        Q->rear = (Q->rear+1)%Q->K;
        Q->Date[Q->rear] = item;
    }

}

int DeleteQ(Queue *Q)
{
    if(Q->rear == Q->front){
        printf("佇列為空\n");
        return NULL;
    }
    else{
        Q->front = (Q->front+1)%Q->K;
        return Q->Date[Q->front];
    }
}