1. 程式人生 > >斐波那契數列的幾種變體

斐波那契數列的幾種變體

斐波那契數列的本源形式:

         f(0) = 0; f(1) = 1; f(n) = f(n-1) + f(n-2).

斐波那契數列的程式碼實現:

(1)迴圈:

public int Fibonacci(int n) {
        int a = 1;
        int b = 1;
        int c = 0;
        if (n < 0) {
            return 0;
        } else if (n == 1 || n == 2) {
            return 1;
        } else {
            for (int i = 3; i <= n; i++) {
                c = a + b;
                b = a;
                a = c;
            }
            return c;
        }
    }

(2)遞迴:

	public int FibonacciN(int input) {
		int n = 0;
		if (input == 0) {
			n = 0;
		} else if (input == 1) {
			n = 1;
		} else {
			n = FibonacciN(input - 1) + FibonacciN(input - 2);
		}
		return n;
	}

博主在Lintcode/牛客刷題的時候發現了幾道有意思的題,這些題乍看起來有點棘手,但其實就是斐波那契換湯不換藥罷了。

比如

變題1:

跳臺階:一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。(from《劍指offer》

牛客網《劍指offer》連結

解:假設一共有f(n)種跳法,最後一步可以跳1級臺階,也可以跳2級臺階,跳1級臺階有f(n-1)種方法,跳2級臺階有f(n-2)種方法,所以可得

       f(n) = f(n-1) + f(n-2)

       f(1) = 1;

       f(2) = 2;

實現程式碼:

    public int JumpFloor(int n) {
        int a = 2;   //f(2)的值
        int b = 1;
        int c = 0;
        if(n<0){
            return 0;
        }else if(n==1){
            return 1;
        }else if(n==2){
            return 2;
        }else {
            for(int i =3;i<=n;i++){
                c = a+b;
                b = a;
                a = c;
            }
            return c;
        }
    }

變題2:

矩形覆蓋:我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?(from《劍指offer》too)

解:這道題看起來比上面的還要複雜些,之前的都是一維的,而這道題卻是二維的。但是我們依據上一題的思路來看這一題,假設一共有f(n)種方法,

下圖是最後一塊/兩塊矩形的排放方式。第一種情況共有f(n-1)種方法,第二中共有f(n-2)種方法。


所以程式碼和以上的情況一樣,此處不再羅列。

總結:沒什麼好總結的,就這樣吧。