斐波那契數列的幾種變體


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

         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)種方法。


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

 

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


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM