1. 程式人生 > >跳臺階與變態跳臺階解法(Java實現)

跳臺階與變態跳臺階解法(Java實現)

這兩道題博主都是用的數學歸納法。

首先

一.跳臺階

題目敘述:一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。

情況:

1階:跳1次

2階:跳2次

3階:跳3次

4階:跳5次

5階:跳8次

6階:跳13次

7階:跳21次

1,2,3,5,8,13,21····

從次數可以看出是一種數列,那就是斐波那契數列,規律是第n+1項等於n項  +(n-1)項a+a_{n-1}=a_{n+1}

關於斐波那契數列的解釋:

因此此題變成求從1開始,斐波那契數列的第n項是什麼?

public class Solution {
	public int JumpFloor(int target) {
		if (target == 0) {
			return 0;
		}
		int[] a = new int[target + 2];//加2是因為必須加到target本身,因此+1,又因為從i-1=0(i=1)開始迴圈,需要陣列a[0]再裝下一個0,因此再+1。
		a[0] = 0;
		a[1] = 1;
		for (int i = 1; i < target + 1; i++) {

			a[i + 1] = a[i] + a[i - 1];

		}
		return a[target + 1];
	}
}

二.變態跳臺階

這個題如果程式不長,不過需要理解它的原理:

情況:

數學歸納法

1階:1種

2階:2種

3階:4種

4階:8種

5階:16種

再往下就是一直第n階級,到2^{n-1}

或者用推理的方式:

首先直接看3階的:3階有4種情況。3階對應4種情況=》3J=4Q

那跳4階的時候:a情況:第0階到第3階(3階的情況)有4種,最後跳1個階跳到第4階,

                           b情況:第0階跳1個階先跳到第1階,第1階到第4階(3階的情況)有4種。

 a與b中,因為第3階到第4階只增加1階。

所以a情況中,前3階中的4種情況中的一種每次只跳1階

最後跳1階登頂與b情況中先跳1個階跳到第1階,後3階中的4種情況中的一種 每次只跳1階,其實同為一種。因為當出現這a,b兩種情況 中 各四種情況中每次只跳1階,都是相當於,全程每次只跳1階。重複計算了一種每次只跳1階的情況。

4階:

4+4=8

8-1=7種

但是再算上從0階直接跳到4階的一種,又為8種。

4階到5階也是一樣:4階為8種

                                 5階中的前4階加最後1階為a1情況,5階第1階加後4階為b1情況

5階:

8+8=16

16-1=15//減一為a1與b1中重複計算了一次每次只跳1階的情況

15+1=16//加一為全階一次跳完的情況

這樣往後推就能知道

每次增加1個臺階,之前的情況都會翻倍

這樣就能得到等比數列的通項公式 a_{n}=a_{1}q^{n-1}a_{1}=1,q=2

通項公式出來了。程式也就很簡單了

public class Solution {
    public int JumpFloorII(int target) {
        return 1<<target-1;//根據等比通項公式 a1*q^(n-1)
    }
}

畫圖辛苦,點個贊吧!