ACM--遞歸效率的比較

測試用例:

2

1 2

3 50

改進前的代碼(用遞歸的方法):

#include<iostream>
using namespace std;
int main()
{
	long long getStep(int, int);
	int n,a,b;
	cin>>n;
	while(n--)
	{
		cin>>a>>b;
		cout<<getStep(a,b)<<endl;
	}
	return 0;
}

long long getStep(int a, int b)
{
	b = b - (a-1); //實際上相當於只有1個參數b,a到b換算成從1到t(t這裏就是更新後的b,a就爲1),步驟都一樣 
	if(b == 2)
	{
		return 1;
	} 
	if(b == 3)
	{
		return 2; 
	}
	
	return getStep(1, b-1) + getStep(1, b-2);
}

改進後的代碼(去除遞歸):

#include<iostream>
using namespace std;
int main()
{
	long long getStep(int, int);
	int n,a,b;
	cin>>n;
	while(n--)
	{
		cin>>a>>b;
		cout<<getStep(a,b)<<endl;
	}
	return 0;
}

long long getStep(int a, int b)
{
	b = b - (a-1); //實際上相當於只有1個參數b,a到b換算成從1到t(t這裏就是更新後的b,a就爲1),步驟都一樣 
	if(b == 2)
	{
		return 1;
	} 
	if(b == 3)
	{
		return 2; 
	}
	long long f1 = 1;
	long long f2 = 2;
	long long step;
	for(int i=3; i<b; i++)
	{
		step = f1 + f2;
		f1 = f2;
		f2 = step;
	}
	return step; 
}

結果說明:

     遞歸算法第二個測試用例,直接導致程序崩潰,而改進後的方法1000ms之內就出結果,故而儘量避免應用遞歸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章