1. 程式人生 > >斐波那契數列---遞迴和遞迴優化

斐波那契數列---遞迴和遞迴優化

斐波那契數列:

       經典數學問題之一;斐波那契數列,又稱黃金分割數列,指的是這樣一個數列:

  1、1、2、3、5、8、13、21、……

想必看到這個數列大家很容易的就推算出來後面好幾項的值,那麼到底有什麼規律,簡單說,就是前兩項的和是第三項的值,也許你會想到的是迭代,也學你想到的是遞迴。

   簡單分析一下遞迴:

int fibon(int n)
{
	n1 ++;
	if(n <= 2)//遞迴出口
	{
		return 1;
	}
	return fibon(n-1) + fibon(n-2);
}
這就是簡單的遞迴,咋先分析一下,若此時你給的n為5,直接到了遞迴這塊,那麼畫個圖分析一下,普通的遞迴:



怎樣優化,很簡單那麼你如果吧已經算過的值,儲存起來下次直接用的話,會不會就遞迴次數明顯減少了。好了下面就有兩個程式碼,一個是非優化,一個是優化的。

#include<stdio.h>

int n1 = 0;//記錄普通的遞迴次數
int n2 = 0;//優化的遞迴次數

//普通遞迴函式
int fibon(int n)
{
	n1 ++;
	if(n <= 2)//遞迴出口
	{
		return 1;
	}
	return fibon(n-1) + fibon(n-2);
}
//優化後的遞迴函式
int fibonac(int a,int b,int n)
{
	n2 ++;
	if(n > 2)
	{
		return fibonac(a+b,a,n-1);
	}
	return a;
}
int main()
{
	int n = 10;//第幾個斐波那契數列
	int a = 1; //斐波那契數列的第一項
	int b = 1;//第二項
	int i = fibon(n);//普通的遞迴
	int j = fibonac(a,b,n);//優化後的遞迴
	printf("第n個fibon數是--%d\n",i);
	printf("次數--%d\n",n1);
	printf("第n個fibon數是--%d\n",j);
	printf("次數--%d\n",n2);
	return 0;
}

ok!


看看結果不難發現優化的好處了吧!