個人筆記之斐波那契數列

青蛙跳臺階:

一隻青蛙一次能夠跳上一級臺階也能夠一次跳上兩級的臺階, 如今有一個n級的臺階,問青蛙有多少種跳法?

反向思考:
要想跳上第 n 級臺階,該怎麼跳?
答:要麼從第 n−1 級臺階跳一級上來,要麼從第 n−2 級臺階跳兩級上來,再無他法。
所以,令 f(n) 表示從第一級臺階跳上第 n 級臺階有跳法總數。則有以下遞推公式:
f(n)=f(n−1)+f(n−2)
這很明顯就是斐波那契數列嘛!那麼問題就簡單了,代碼以下:

public int JumpFloor(int n) {
	if (n < 1) {return -1;}
	if (n == 1) {return 1;}
	if (n == 2) {return 2;}
	int result = 0, temp1 = 1, temp2 = 2, count = 0;
	while (count != n - 2) {//由於count==1的時候,result是3級時的結果,以此類推,n級時,count==n-2
		result = temp1 + temp2;
		temp1 = temp2;
		temp2 = result;
		count++;
	}
	return result;
}複製代碼

變形青蛙跳臺階:

一隻青蛙一次能夠跳上1級臺階,也能夠跳上2級……它也能夠跳上n級。 求該青蛙跳上一個n級的臺階總共有多少種跳法?

一樣反過來思考:

跳上第n階臺階,有多少種跳法?java

答:能夠從n-1階跳上來,也能夠從n-2階跳上來,也能夠從n-3階跳上來……能夠從第1階跳上來。則:
f(n)=f(n-1)+f(n-2)+…f(1)
同理:
f(n-1)=f(n-2)+f(n-3)+…f(1)
綜上:
f(n)=2f(n−1)=4f(n−2)=8f(n−3)=...
即:
f(n)=2f(n−1)=2^2f(n−2)=2^3f(n−3)=...=2^(n−1)f(n−(n−1))=2^(n−1)f(1)
由於 f(1)=1,因此 f(n)=2^(n-1)

public static int JumpFloorII(int n) {
    int result=1;
    for(int i=1;i<=n-1;i++){
        result=result*2;
    }
    return result;
}複製代碼

矩形覆蓋問題:

咱們能夠用2*1的小矩形橫着或者豎着去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?

若第一個矩形豎着填充,那麼問題就變成了求填充2*(n-1)大矩形的方法數

若第一個矩形橫着填充,那麼它下面的兩個格子只能一樣橫着填充,問題就變成了求填充2*(n-2)大矩形的方法數算法


若令f(n)表示填充n*2的大矩形則:
f(n)=f(n-1)+f(n-2)
一樣這也是一個斐波那契數列,解決代碼和第一個問題同樣;

斐波那契數列原問題:

解法以下:spa

// 解法1:算法簡潔但效率較低(不推薦)
public int Fibonacci(int n,String mark) {
    if(n<=0){
    return 0;
    }
    if(n==1){
    return 1;
    }
    return Fibonacci(n-1)+Fibonacci(n-2);
}
// 解法2:思路清晰且效率高
public static int Fibonacci(int n) {
	if (n <= 0) {
     return 0;
	}
	if (n == 1) {
     return 1;
	}
	int result = 0, temp1 = 0, temp2 = 1, count = 0;
	while (count != n - 1) {
		result = temp1 + temp2;
		temp1 = temp2;
		temp2 = result;
		count++;
	}
	return result;
}複製代碼
相關文章
相關標籤/搜索