斐波那契數列

遞歸與循環

    若我們要重複的多次計算相同的問題,通常可以選擇用遞歸或者循環兩種方法。

int AddFrom1ToN(int n)
{
	int add = 0;
	for (int i = 1; i <= n; i++)
	{
		add += i;
	}
	return add;
}
int AddFrom1ToN(int n)
{
	if (n <= 0)
	{
		return 0;
	}
	return n + AddFrom1ToN(n - 1);
	//return n<=0?0:n + AddFrom1ToN(n - 1);
}

    通常遞歸的代碼比較簡潔,但是由於它是函數調用自身,有時間的消耗和空間的消耗,且存在棧溢出的隱患


題目:

    寫一個函數,輸入n,輸出斐波那契數列第n項

    f(N)= 0                 N=0;

            1                 N=1;

            f(N+1)+f(N-1) N>1

程序1.0

long long Fibonacci(size_t n)
{
		if (n = 0)
			return 0;
		if (n = 1)
			return 1;
		return Fibonacci(n - 1) + Fibonacci(n - 2);
}

分析:

    1.函數返回值類型爲long long,防止數字太大溢出

    2.若n過大則會導致棧溢出

程序2.0

    時間複雜度O(n)

long long Fibonacci(size_t n)
{
	if (0==n)
		return 0;
	if (1==n)
		return 1;
	long long first = 0;
	long long second = 1;
	long long result = 0;
	
	for (size_t i = 2; i <= n; i++)
	{
		result = first + second;
		first = second;
		second = result;
	}
	return result;
}

測試

  1. 功能測試,輸入2,4,6,8

  2. 邊界值測試,輸入0,1,2

3.  性能測試,輸入50,70

舉一反三j_0028.gif

    1.一隻青蛙跳臺階,一次可以跳一階或兩階,計算這個青蛙跳n階臺階有多少種跳法

分析:

    (0階0種跳法)若爲1階,只有一種跳發,兩階,有兩種跳發,三階3種。。。。

最後可看成是斐波那契數列的另一種延伸。

  

   2.一隻青蛙跳臺階,一次可以跳一階,兩階,也可以跳n階,計算這個青蛙跳n階臺階有多少種跳法

經分析可得出一個數學公式 f(n)=2^(n-1)

    

    3.我們可以用2*1的小矩形橫着或者豎着去覆蓋更大的矩形,8個2*1的小矩形無重疊覆蓋一個2*8放的大矩形,共多少種方法



    

















分析: 先把2*8的覆蓋方法爲f(8),用第一個1*2的小矩形去覆蓋大矩形的最左邊有兩個選擇,橫着或者豎着,當豎着的時候,右邊還有2*7個區域(f(7)),若橫着,則剩下的區域爲2*6(f(6)),所以可以得出,f(8)=f(7)+f(6),斐波那契數列問題


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