(C++)求解斐波那契數列.(遞歸與非遞歸)

斐波那契額數列:1、1、2、3、5、8、13、21、34…
首先很容易想到遞推關係式:F(n)= F(n-1) + F(n - 2).(n>=3)。

方法1:

int fib1(int n)
{
	if (n <= 2)
	{
		return 1;
	}

	return fib1(n - 1) + fib1(n-2);
}

方法二:

int fib2(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	int * array = new int[n + 1];
	memset(array, 0, sizeof(int)*(n + 1));
	array[1] = array[2] = 1;
	return fib2(array, n);
}

//函數重載
int fib2(int * array, int n)
{
	if (array[n] == 0)
	{
		array[n] = fib2(array, n - 1) + fib2(array,n - 2);
	}
	return array[n];
}

方法三:非遞歸

int fib3(int n)
{
	if (n <= 2)
	{
		return 1;
	}

	int *array = new int[n + 1];
	memset(array, 0, sizeof(int)*(n + 1));
	array[1] = array[2] = 1;

	for (int i = 3; i <= n; i++)
	{
		array[i] = array[i - 1] + array[i - 2];
	}
	return array[n];
}

方法四:非遞歸

//滾動數組
int fib4(int n)
{
	if (n <= 2)
	{
		return 1;
	}

	int *array = new int[2];
	memset(array, 0, sizeof(int)*2);
	array[0] = array[1] = 1;

	for (int i = 3; i <= n; i++)
	{
		array[i % 2] = array[(i - 1) % 2] + array[(i - 2) % 2];
	}
	return array[n % 2];
}

方法五:滾動數組

//滾動數組.模運算的處理
int fib4(int n)
{
	if (n <= 2)
	{
		return 1;
	}

	int *array = new int[2];
	memset(array, 0, sizeof(int) * 2);
	array[0] = array[1] = 1;

	for (int i = 3; i <= n; i++)
	{
		array[i & 1] = array[(i - 1) & 1] + array[(i - 2) & 1];
	}
	return array[n & 1];
}

最近在學習算法,開始填坑啦。後期開始加分析進去。

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