【資料結構】求K階斐波那契數列
阿新 • • 發佈:2019-01-03
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)
- 輸入數列的前k項,依次入隊,
- 隊首元素出隊並輸出
- t入隊(t初始值為1)
- 對佇列中所有元素求和為t
- 若t<=max執行步驟2
- 輸出佇列中餘下的元素
程式碼如下
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];
}
}