1. 程式人生 > >使用棧(非遞迴方法)解決斐波那契數列問題

使用棧(非遞迴方法)解決斐波那契數列問題

解決斐波那契數列問題可以使用遞迴,迭代,以及使用棧等方法,下面講述使用棧的方法。

首先,我們從數列的遞迴呼叫樹就可以發現一些資訊。


要求第n個斐波那契數,就要向左下和右下走兩步。所以使用結構體,其中dir表示向左還是向右,1為向左,0為向右。

struct node
{
	int value;  //代表要求的第x個數
	int dir;
};

採用累加的方式算出結果:當value為1時加1,為0時加0. 注意:左邊是n-1,而右邊是n-2.

int StackFib(int n)
{
	node w;
	stack<node> s;
	int sum = 0;

	while (1)
	{
		while (1)
		{
			w.value = n;
			w.dir = 1;
			s.push(w);
			n--;
			if (n < 0)
				break;
		}
		while (!s.empty())
		{
			w = s.top();
			s.pop();
			if (w.value == 0)
				sum += 0;
			else if (w.value == 1)
				sum += 1;
			else if (w.value != 0 && w.value != 1 && w.dir == 1)
			{
				w.dir = 2;
				s.push(w);
				n = w.value-2;
				break;
			}
		}
		if (s.empty())
			break;
	}
	return sum;
}