# Queue# Breadth-First Search# Recursion Simulation

d486 - Fibonacci 's computation process

🔗 前往 ZeroJudge 原題

題目描述

題目要求模擬費氏數列的計算過程,並按照指定的格式輸出。輸入一個數字 n,輸出計算 f(n) 的過程,直到分解到只剩下 f(0) 或 f(1) 為止。最後輸出 f(n) 的值。

解題思路

程式使用佇列 (queue) 來模擬費氏數列的遞迴計算過程。首先,將輸入的 n 放入佇列。然後,不斷從佇列中取出一個數 k,輸出 "f(k)"。如果 k 大於 1,則將 k-1 和 k-2 放入佇列。如果 k 等於 1,則將 k 放入佇列。每次輸出一定數量的 f(k) 後,計算總和,並在最後輸出 f(n) 的值。使用 swap 函數來清空佇列,以便處理下一組輸入。

複雜度分析

  • 時間複雜度: O(2^n) (因為模擬了遞迴的過程,最壞情況下需要計算所有可能的遞迴呼叫)
  • 空間複雜度: O(2^n) (佇列中可能存儲大量的元素,取決於 n 的值)

程式碼

#include <iostream>
#include <queue>
using namespace std;
int n;
queue <int> q; 
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	while(cin >> n){
		if(n==0)break; 
		queue <int> empty;
		swap(empty,q);
		q.push(n);
		int s=1,i=0,t=0,ans=0;
		while(i<n){
			int k=q.front();
			cout << "f(" << k << ") ";
			--s;
			if(k>1){
				q.push(k-1);
				q.push(k-2);
				t+=2;
			}
			else{
				q.push(k);
				++t;
			}
			if(s==0){
				cout << "\n";
				if(i==n-1)ans=t;
				s=t;
				t=0;
				++i;
			}
			q.pop();
		}
		cout << "f(" << n << ") = " << ans << "\n";
	}
}

Discussion